Zelda Classic Coverage Report


Directory: src/
File: src/zc/zc_sys.cpp
Date: 2022-12-31 12:18:40
Exec Total Coverage
Lines: 1470 3925 37.5%
Functions: 121 338 35.8%
Branches: 779 2728 28.6%

Line Branch Exec Source
1 //--------------------------------------------------------
2 // Zelda Classic
3 // by Jeremy Craner, 1999-2000
4 //
5 // zc_sys.cc
6 //
7 // System functions, input handlers, GUI stuff, etc.
8 // for Zelda Classic.
9 //
10 //--------------------------------------------------------
11
12 // to prevent <map> from generating errors
13 #define __GTHREAD_HIDE_WIN32API 1
14
15 #include "precompiled.h" //always first
16 #include "zc_sys.h"
17
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <math.h>
22 #include <map>
23 #include <filesystem>
24 #include <ctype.h>
25 #include <sstream>
26 #include "base/zc_alleg.h"
27 #include "gamedata.h"
28 #include "zc_init.h"
29 #include "init.h"
30 #include "replay.h"
31 #include "cheats.h"
32 #include "render.h"
33 #include "base/zc_math.h"
34 #include "base/zapp.h"
35
36 #ifdef ALLEGRO_DOS
37 #include <unistd.h>
38 #endif
39
40 #include "metadata/metadata.h"
41 #include "zelda.h"
42 #include "tiles.h"
43 #include "base/colors.h"
44 #include "pal.h"
45 #include "base/zsys.h"
46 #include "qst.h"
47 #include "zc_sys.h"
48 #include "play_midi.h"
49 #include "debug.h"
50 #include "jwin.h"
51 #include "base/jwinfsel.h"
52 #include "base/gui.h"
53 #include "midi.h"
54 #include "subscr.h"
55 #include "maps.h"
56 #include "sprite.h"
57 #include "guys.h"
58 #include "hero.h"
59 #include "title.h"
60 #include "particles.h"
61 #include "zconsole.h"
62 #include "ffscript.h"
63 #include "dialog/info.h"
64 #include "dialog/alert.h"
65 #include <fmt/format.h>
66
67 #ifdef __EMSCRIPTEN__
68 #include "base/emscripten_utils.h"
69 #endif
70
71 extern FFScript FFCore;
72 extern bool Playing;
73 int32_t sfx_voice[WAV_COUNT];
74 int32_t d_stringloader(int32_t msg,DIALOG *d,int32_t c);
75 int32_t d_midilist_proc(int32_t msg,DIALOG *d,int32_t c);
76
77 extern byte monochrome_console;
78
79 extern FONT *lfont;
80 extern HeroClass Hero;
81 extern FFScript FFCore;
82 extern ZModule zcm;
83 extern zcmodule moduledata;
84 extern sprite_list guys, items, Ewpns, Lwpns, Sitems, chainlinks, decorations;
85 extern particle_list particles;
86 extern int32_t loadlast;
87 extern word passive_subscreen_doscript;
88 extern bool passive_subscreen_waitdraw;
89 byte use_dwm_flush;
90 byte use_save_indicator;
91 byte midi_patch_fix;
92 bool midi_paused=false;
93 int32_t paused_midi_pos = 0;
94 byte midi_suspended = 0;
95 byte callback_switchin = 0;
96 byte zc_192b163_warp_compatibility;
97 char modulepath[2048];
98 byte epilepsyFlashReduction;
99 signed char pause_in_background_menu_init = 0;
100 byte pause_in_background = 0;
101 bool is_sys_pal = false;
102 extern PALETTE* hw_palette;
103 extern bool update_hw_pal;
104 extern const char* dmaplist(int32_t index, int32_t* list_size);
105
106
107 extern bool kb_typing_mode; //script only, for disbaling key presses affecting Hero, etc.
108 extern int32_t cheat_modifier_keys[4]; //two options each, default either control and either shift
109 //extern byte refresh_select_screen;
110 //extern movingblock mblock2; //mblock[4]?
111 //extern int32_t db;
112
113 static const char *ZC_str = "Zelda Classic";
114 extern char save_file_name[1024];
115 #ifdef ALLEGRO_DOS
116 const char *qst_dir_name = "dos_qst_dir";
117 #elif defined(ALLEGRO_WINDOWS)
118 const char *qst_dir_name = "win_qst_dir";
119 static const char *qst_module_name = "current_module";
120 #elif defined(ALLEGRO_LINUX)
121 const char *qst_dir_name = "linux_qst_dir";
122 static const char *qst_module_name = "current_module";
123 #elif defined(__APPLE__)
124 const char *qst_dir_name = "osx_qst_dir";
125 static const char *qst_module_name = "current_module";
126 #endif
127 #ifdef ALLEGRO_LINUX
128 static const char *samplepath = "samplesoundset/patches.dat";
129 #endif
130 char qst_files_path[2048];
131
132 #ifdef _MSC_VER
133 #define getcwd _getcwd
134 #endif
135
136 bool rF11();
137 bool rI();
138 bool rQ();
139 bool zc_key_pressed();
140
141 #ifdef _WIN32
142
143 // This should only be necessary for MinGW, since it doesn't have a dwmapi.h. Add another #ifdef if you like.
144 extern "C"
145 {
146 typedef HRESULT(WINAPI *t_DwmFlush)();
147 typedef HRESULT(WINAPI *t_DwmIsCompositionEnabled)(BOOL *pfEnabled);
148 }
149
150 void do_DwmFlush()
151 {
152 static HMODULE shell = LoadLibrary("dwmapi.dll");
153
154 if(!shell)
155 return;
156
157 static t_DwmFlush flush=reinterpret_cast<t_DwmFlush>(GetProcAddress(shell, "DwmFlush"));
158 static t_DwmIsCompositionEnabled isEnabled=reinterpret_cast<t_DwmIsCompositionEnabled>(GetProcAddress(shell, "DwmIsCompositionEnabled"));
159
160 BOOL enabled;
161 isEnabled(&enabled);
162
163 if(isEnabled)
164 flush();
165 }
166
167 #endif // _WIN32
168
169 // Dialogue largening
170 void large_dialog(DIALOG *d)
171 {
172 large_dialog(d, 1.5);
173 }
174
175 void large_dialog(DIALOG *d, float RESIZE_AMT)
176 {
177 if(!d[0].d1)
178 {
179 d[0].d1 = 1;
180 int32_t oldwidth = d[0].w;
181 int32_t oldheight = d[0].h;
182 int32_t oldx = d[0].x;
183 int32_t oldy = d[0].y;
184 d[0].x -= int32_t(d[0].w/RESIZE_AMT);
185 d[0].y -= int32_t(d[0].h/RESIZE_AMT);
186 d[0].w = int32_t(d[0].w*RESIZE_AMT);
187 d[0].h = int32_t(d[0].h*RESIZE_AMT);
188
189 for(int32_t i=1; d[i].proc !=NULL; i++)
190 {
191 // Place elements horizontally
192 double xpc = ((double)(d[i].x - oldx) / (double)oldwidth);
193 d[i].x = int32_t(d[0].x + (xpc*d[0].w));
194
195 if(d[i].proc != d_stringloader)
196 {
197 if(d[i].proc==d_bitmap_proc)
198 {
199 d[i].w *= 2;
200 }
201 else d[i].w = int32_t(d[i].w*RESIZE_AMT);
202 }
203
204 // Place elements vertically
205 double ypc = ((double)(d[i].y - oldy) / (double)oldheight);
206 d[i].y = int32_t(d[0].y + (ypc*d[0].h));
207
208 // Vertically resize elements
209 if(d[i].proc == jwin_edit_proc || d[i].proc == jwin_check_proc || d[i].proc == jwin_checkfont_proc)
210 {
211 d[i].h = int32_t((double)d[i].h*1.5);
212 }
213 else if(d[i].proc == jwin_droplist_proc)
214 {
215 d[i].y += int32_t((double)d[i].h*0.25);
216 d[i].h = int32_t((double)d[i].h*1.25);
217 }
218 else if(d[i].proc==d_bitmap_proc)
219 {
220 d[i].h *= 2;
221 }
222 else d[i].h = int32_t(d[i].h*RESIZE_AMT);
223
224 // Fix frames
225 if(d[i].proc == jwin_frame_proc)
226 {
227 d[i].x++;
228 d[i].y++;
229 d[i].w-=4;
230 d[i].h-=4;
231 }
232 }
233 }
234
235 for(int32_t i=1; d[i].proc!=NULL; i++)
236 {
237 if(d[i].proc==jwin_slider_proc)
238 continue;
239
240 // Bigger font
241 bool bigfontproc = (d[i].proc != d_midilist_proc && d[i].proc != jwin_droplist_proc && d[i].proc != jwin_abclist_proc && d[i].proc != jwin_list_proc);
242
243 if(!d[i].dp2 && bigfontproc)
244 {
245 //d[i].dp2 = (d[i].proc == jwin_edit_proc) ? sfont3 : lfont_l;
246 d[i].dp2 = lfont_l;
247 }
248 else if(!bigfontproc)
249 {
250 // ((ListData *)d[i].dp)->font = &sfont3;
251 ((ListData *)d[i].dp)->font = &lfont_l;
252 }
253
254 // Make checkboxes work
255 if(d[i].proc == jwin_check_proc)
256 d[i].proc = jwin_checkfont_proc;
257 else if(d[i].proc == jwin_radio_proc)
258 d[i].proc = jwin_radiofont_proc;
259 }
260
261 jwin_center_dialog(d);
262 }
263
264
265 /**********************************/
266 /******** System functions ********/
267 /**********************************/
268
269 static char cfg_sect[] = "zeldadx"; //We need to rename this.
270 static char ctrl_sect[] = "Controls";
271 static char sfx_sect[] = "Volume";
272
273 int32_t d_dummy_proc(int32_t,DIALOG *,int32_t)
274 {
275 return D_O_K;
276 }
277
278 13 void load_game_configs()
279 {
280 13 strcpy(moduledata.module_name,zc_get_config("ZCMODULE",qst_module_name,"classic.zmod"));
281 13 joystick_index = zc_get_config(ctrl_sect,"joystick_index",0);
282 13 js_stick_1_x_stick = zc_get_config(ctrl_sect,"js_stick_1_x_stick",0);
283 13 js_stick_1_x_axis = zc_get_config(ctrl_sect,"js_stick_1_x_axis",0);
284 13 js_stick_1_x_offset = zc_get_config(ctrl_sect,"js_stick_1_x_offset",0) ? 128 : 0;
285 13 js_stick_1_y_stick = zc_get_config(ctrl_sect,"js_stick_1_y_stick",0);
286 13 js_stick_1_y_axis = zc_get_config(ctrl_sect,"js_stick_1_y_axis",1);
287 13 js_stick_1_y_offset = zc_get_config(ctrl_sect,"js_stick_1_y_offset",0) ? 128 : 0;
288 13 js_stick_2_x_stick = zc_get_config(ctrl_sect,"js_stick_2_x_stick",1);
289 13 js_stick_2_x_axis = zc_get_config(ctrl_sect,"js_stick_2_x_axis",0);
290 13 js_stick_2_x_offset = zc_get_config(ctrl_sect,"js_stick_2_x_offset",0) ? 128 : 0;
291 13 js_stick_2_y_stick = zc_get_config(ctrl_sect,"js_stick_2_y_stick",1);
292 13 js_stick_2_y_axis = zc_get_config(ctrl_sect,"js_stick_2_y_axis",1);
293 13 js_stick_2_y_offset = zc_get_config(ctrl_sect,"js_stick_2_y_offset",0) ? 128 : 0;
294 13 analog_movement = (zc_get_config(ctrl_sect,"analog_movement",1));
295
296 //cheat modifier keya
297 13 cheat_modifier_keys[0] = zc_get_config(ctrl_sect,"key_cheatmod_a1",KEY_ZC_LCONTROL);
298 13 cheat_modifier_keys[1] = zc_get_config(ctrl_sect,"key_cheatmod_a2",0);
299 13 cheat_modifier_keys[2] = zc_get_config(ctrl_sect,"key_cheatmod_b1",KEY_ZC_RCONTROL);
300 13 cheat_modifier_keys[3] = zc_get_config(ctrl_sect,"key_cheatmod_b2",0);
301
302
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13 if((uint32_t)joystick_index >= MAX_JOYSTICKS)
303 joystick_index = 0;
304
305 13 Akey = zc_get_config(ctrl_sect,"key_a",KEY_Z);
306 13 Bkey = zc_get_config(ctrl_sect,"key_b",KEY_X);
307 13 Skey = zc_get_config(ctrl_sect,"key_s",KEY_ENTER);
308 13 Lkey = zc_get_config(ctrl_sect,"key_l",KEY_Q);
309 13 Rkey = zc_get_config(ctrl_sect,"key_r",KEY_W);
310 13 Pkey = zc_get_config(ctrl_sect,"key_p",KEY_SPACE);
311 13 Exkey1 = zc_get_config(ctrl_sect,"key_ex1",KEY_A);
312 13 Exkey2 = zc_get_config(ctrl_sect,"key_ex2",KEY_S);
313 13 Exkey3 = zc_get_config(ctrl_sect,"key_ex3",KEY_D);
314 13 Exkey4 = zc_get_config(ctrl_sect,"key_ex4",KEY_C);
315
316 13 DUkey = zc_get_config(ctrl_sect,"key_up", KEY_UP);
317 13 DDkey = zc_get_config(ctrl_sect,"key_down", KEY_DOWN);
318 13 DLkey = zc_get_config(ctrl_sect,"key_left", KEY_LEFT);
319 13 DRkey = zc_get_config(ctrl_sect,"key_right",KEY_RIGHT);
320
321 13 Abtn = zc_get_config(ctrl_sect,"btn_a",2);
322 13 Bbtn = zc_get_config(ctrl_sect,"btn_b",1);
323 13 Sbtn = zc_get_config(ctrl_sect,"btn_s",10);
324 13 Mbtn = zc_get_config(ctrl_sect,"btn_m",9);
325 13 Lbtn = zc_get_config(ctrl_sect,"btn_l",5);
326 13 Rbtn = zc_get_config(ctrl_sect,"btn_r",6);
327 13 Pbtn = zc_get_config(ctrl_sect,"btn_p",12);
328 13 Exbtn1 = zc_get_config(ctrl_sect,"btn_ex1",7);
329 13 Exbtn2 = zc_get_config(ctrl_sect,"btn_ex2",8);
330 13 Exbtn3 = zc_get_config(ctrl_sect,"btn_ex3",4);
331 13 Exbtn4 = zc_get_config(ctrl_sect,"btn_ex4",3);
332
333 13 DUbtn = zc_get_config(ctrl_sect,"btn_up",13);
334 13 DDbtn = zc_get_config(ctrl_sect,"btn_down",14);
335 13 DLbtn = zc_get_config(ctrl_sect,"btn_left",15);
336 13 DRbtn = zc_get_config(ctrl_sect,"btn_right",16);
337
338 13 epilepsyFlashReduction = zc_get_config(cfg_sect,"epilepsy_flash_reduction",0);
339
340 13 digi_volume = zc_get_config(sfx_sect,"digi",248);
341 13 midi_volume = zc_get_config(sfx_sect,"midi",255);
342 13 sfx_volume = zc_get_config(sfx_sect,"sfx",248);
343 13 emusic_volume = zc_get_config(sfx_sect,"emusic",248);
344 13 pan_style = zc_get_config(sfx_sect,"pan",1);
345 // 1 <= zcmusic_bufsz <= 128
346 13 zcmusic_bufsz = vbound(zc_get_config(sfx_sect,"zcmusic_bufsz",64),1,128);
347 13 volkeys = zc_get_config(sfx_sect,"volkeys",0)!=0;
348 13 zc_vsync = zc_get_config(cfg_sect,"vsync",0);
349 13 Throttlefps = zc_get_config(cfg_sect,"throttlefps",1)!=0;
350 13 TransLayers = zc_get_config(cfg_sect,"translayers",1)!=0;
351 13 SnapshotFormat = zc_get_config(cfg_sect,"snapshot_format",3);
352 13 NameEntryMode = zc_get_config(cfg_sect,"name_entry_mode",0);
353 #ifdef __EMSCRIPTEN__
354 if (em_is_mobile()) NameEntryMode = 2;
355 #endif
356 13 ShowFPS = zc_get_config(cfg_sect,"showfps",0)!=0;
357 13 NESquit = zc_get_config(cfg_sect,"fastquit",0)!=0;
358 13 ClickToFreeze = zc_get_config(cfg_sect,"clicktofreeze",1)!=0;
359 13 title_version = zc_get_config(cfg_sect,"title",2);
360 13 abc_patternmatch = zc_get_config(cfg_sect, "lister_pattern_matching", 1);
361 13 pause_in_background = zc_get_config(cfg_sect, "pause_in_background", 0);
362
363 //default - scale x2, 640 x 480
364 13 window_width = resx = zc_get_config(cfg_sect,"window_width",640);
365 13 window_height = resy = zc_get_config(cfg_sect,"window_height",480);
366 13 SaveDragResize = zc_get_config(cfg_sect,"save_drag_resize",0)!=0;
367 13 DragAspect = zc_get_config(cfg_sect,"drag_aspect",0)!=0;
368 13 SaveWinPos = zc_get_config(cfg_sect,"save_window_position",0)!=0;
369
370 13 loadlast = zc_get_config(cfg_sect,"load_last",0);
371
372 13 fullscreen = zc_get_config(cfg_sect,"fullscreen",0);
373
374 13 zc_color_depth = (byte) zc_get_config(cfg_sect,"color_depth",8);
375
376 //workaround for the 100% CPU bug. -Gleeok
377 #ifdef ALLEGRO_MACOSX //IIRC rest(0) was a mac issue fix.
378 frame_rest_suggest = (byte) zc_get_config(cfg_sect,"frame_rest_suggest",0);
379 #else
380 13 frame_rest_suggest = (byte) zc_get_config(cfg_sect,"frame_rest_suggest",1);
381 #endif
382
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 frame_rest_suggest = zc_min(2, frame_rest_suggest);
383
384 13 forceExit = (byte) zc_get_config(cfg_sect,"force_exit",0);
385
386 #ifdef _WIN32
387 zasm_debugger = (byte) zc_get_config("CONSOLE","print_ZASM",0);
388 zscript_debugger = (byte) zc_get_config("CONSOLE","ZScript_Debugger",0);
389 //use_win7_keyboard_fix = (byte) zc_get_config(cfg_sect,"use_win7_key_fix",0);
390 use_win32_proc = (byte) zc_get_config(cfg_sect,"zc_win_proc_fix",0); //buggy
391
392 // This one's for Aero
393 use_dwm_flush = (byte) zc_get_config("zeldadx","use_dwm_flush",0);
394
395 // And this one fixes patches unloading on some MIDI setups
396 midi_patch_fix = (byte) zc_get_config("zeldadx","midi_patch_fix",1);
397 monochrome_console = (byte) zc_get_config("CONSOLE","monochrome_debuggers",0);
398 #else //UNIX
399 13 zasm_debugger = (byte) zc_get_config("CONSOLE","print_ZASM",0);
400 13 zscript_debugger = (byte) zc_get_config("CONSOLE","ZScript_Debugger",0);
401 13 monochrome_console = (byte) zc_get_config("CONSOLE","monochrome_debuggers",0);
402 #endif
403 13 clearConsoleOnLoad = zc_get_config("CONSOLE","clear_console_on_load",1)!=0;
404
405 13 char const* default_path = "";
406 13 strcpy(qstdir,zc_get_config(cfg_sect,qst_dir_name,default_path));
407
408
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13 if(strlen(qstdir)==0)
409 {
410 13 getcwd(qstdir,2048);
411 13 fix_filename_case(qstdir);
412 13 fix_filename_slashes(qstdir);
413 13 put_backslash(qstdir);
414 13 }
415 else
416 {
417 chop_path(qstdir);
418 }
419
420 13 strcpy(qstpath,qstdir); //qstpath is the local (for this run of ZC) quest path, qstdir is the universal quest dir.
421 13 ss_enable = zc_get_config(cfg_sect,"ss_enable",1) ? 1 : 0;
422 13 ss_after = vbound(zc_get_config(cfg_sect,"ss_after",14), 0, 14);
423 13 ss_speed = vbound(zc_get_config(cfg_sect,"ss_speed",2), 0, 6);
424 13 ss_density = vbound(zc_get_config(cfg_sect,"ss_density",3), 0, 6);
425 13 heart_beep = zc_get_config(cfg_sect,"heart_beep",1)!=0;
426 //gui_colorset = zc_get_config(cfg_sect,"gui_colorset",0);
427 13 sfxdat = zc_get_config(cfg_sect,"use_sfx_dat",1);
428 13 fullscreen = zc_get_config(cfg_sect,"fullscreen",0);
429 13 use_save_indicator = zc_get_config(cfg_sect,"save_indicator",0);
430 13 zc_192b163_warp_compatibility = zc_get_config(cfg_sect,"zc_192b163_warp_compatibility",0);
431 13 }
432
433 void save_control_configs(bool kb)
434 {
435 if(kb)
436 {
437 zc_set_config(ctrl_sect,"key_cheatmod_a1",cheat_modifier_keys[0]);
438 zc_set_config(ctrl_sect,"key_cheatmod_a2",cheat_modifier_keys[1]);
439 zc_set_config(ctrl_sect,"key_cheatmod_b1",cheat_modifier_keys[2]);
440 zc_set_config(ctrl_sect,"key_cheatmod_b2",cheat_modifier_keys[3]);
441
442 if (!replay_is_replaying())
443 {
444 zc_set_config(ctrl_sect,"key_a",Akey);
445 zc_set_config(ctrl_sect,"key_b",Bkey);
446 zc_set_config(ctrl_sect,"key_s",Skey);
447 zc_set_config(ctrl_sect,"key_l",Lkey);
448 zc_set_config(ctrl_sect,"key_r",Rkey);
449 zc_set_config(ctrl_sect,"key_p",Pkey);
450 zc_set_config(ctrl_sect,"key_ex1",Exkey1);
451 zc_set_config(ctrl_sect,"key_ex2",Exkey2);
452 zc_set_config(ctrl_sect,"key_ex3",Exkey3);
453 zc_set_config(ctrl_sect,"key_ex4",Exkey4);
454 zc_set_config(ctrl_sect,"key_up", DUkey);
455 zc_set_config(ctrl_sect,"key_down", DDkey);
456 zc_set_config(ctrl_sect,"key_left", DLkey);
457 zc_set_config(ctrl_sect,"key_right",DRkey);
458 }
459 }
460 else
461 {
462 zc_set_config(ctrl_sect,"joystick_index",joystick_index);
463 zc_set_config(ctrl_sect,"js_stick_1_x_stick",js_stick_1_x_stick);
464 zc_set_config(ctrl_sect,"js_stick_1_x_axis",js_stick_1_x_axis);
465 zc_set_config(ctrl_sect,"js_stick_1_x_offset",js_stick_1_x_offset ? 1 : 0);
466 zc_set_config(ctrl_sect,"js_stick_1_y_stick",js_stick_1_y_stick);
467 zc_set_config(ctrl_sect,"js_stick_1_y_axis",js_stick_1_y_axis);
468 zc_set_config(ctrl_sect,"js_stick_1_y_offset",js_stick_1_y_offset ? 1 : 0);
469 zc_set_config(ctrl_sect,"js_stick_2_x_stick",js_stick_2_x_stick);
470 zc_set_config(ctrl_sect,"js_stick_2_x_axis",js_stick_2_x_axis);
471 zc_set_config(ctrl_sect,"js_stick_2_x_offset",js_stick_2_x_offset ? 1 : 0);
472 zc_set_config(ctrl_sect,"js_stick_2_y_stick",js_stick_2_y_stick);
473 zc_set_config(ctrl_sect,"js_stick_2_y_axis",js_stick_2_y_axis);
474 zc_set_config(ctrl_sect,"js_stick_2_y_offset",js_stick_2_y_offset ? 1 : 0);
475 zc_set_config(ctrl_sect,"analog_movement",analog_movement);
476
477 zc_set_config(ctrl_sect,"btn_a",Abtn);
478 zc_set_config(ctrl_sect,"btn_b",Bbtn);
479 zc_set_config(ctrl_sect,"btn_s",Sbtn);
480 zc_set_config(ctrl_sect,"btn_m",Mbtn);
481 zc_set_config(ctrl_sect,"btn_l",Lbtn);
482 zc_set_config(ctrl_sect,"btn_r",Rbtn);
483 zc_set_config(ctrl_sect,"btn_p",Pbtn);
484 zc_set_config(ctrl_sect,"btn_ex1",Exbtn1);
485 zc_set_config(ctrl_sect,"btn_ex2",Exbtn2);
486 zc_set_config(ctrl_sect,"btn_ex3",Exbtn3);
487 zc_set_config(ctrl_sect,"btn_ex4",Exbtn4);
488
489 zc_set_config(ctrl_sect,"btn_up",DUbtn);
490 zc_set_config(ctrl_sect,"btn_down",DDbtn);
491 zc_set_config(ctrl_sect,"btn_left",DLbtn);
492 zc_set_config(ctrl_sect,"btn_right",DRbtn);
493 }
494 }
495
496 void save_game_configs()
497 {
498 packfile_password("");
499
500 zc_set_config("ZCMODULE",qst_module_name,moduledata.module_name);
501
502 if (all_get_display() && !all_get_fullscreen_flag()&& SaveWinPos)
503 {
504 int o_window_x, o_window_y;
505 al_get_window_position(all_get_display(), &o_window_x, &o_window_y);
506 zc_set_config(cfg_sect,"window_x",o_window_x);
507 zc_set_config(cfg_sect,"window_y",o_window_y);
508 }
509
510 if (all_get_display() && !all_get_fullscreen_flag() && SaveDragResize)
511 {
512 double monitor_scale = zc_get_monitor_scale();
513 window_width = al_get_display_width(all_get_display()) / monitor_scale;
514 window_height = al_get_display_height(all_get_display()) / monitor_scale;
515 zc_set_config(cfg_sect,"window_width",window_width);
516 zc_set_config(cfg_sect,"window_height",window_height);
517 }
518
519 zc_set_config(cfg_sect,"load_last",loadlast);
520 chop_path(qstdir);
521 zc_set_config(cfg_sect,qst_dir_name,qstdir);
522 zc_set_config("SAVEFILE","save_filename",save_file_name);
523 zc_set_config(cfg_sect,"use_sfx_dat",sfxdat);
524 zc_set_config(cfg_sect,"frame_rest_suggest",frame_rest_suggest);
525
526 flush_config_file();
527 #ifdef __EMSCRIPTEN__
528 em_sync_fs();
529 #endif
530 }
531
532 //----------------------------------------------------------------
533
534 // Timers
535
536 8932 void fps_callback()
537 {
538 8932 lastfps=framecnt;
539 8932 dword tempsecs = fps_secs;
540 8932 ++tempsecs;
541 //avgfps=((long double)avgfps*fps_secs+lastfps)/(++fps_secs); // DJGPP doesn't like this
542 8932 avgfps=((long double)avgfps*fps_secs+lastfps)/(tempsecs);
543 8932 ++fps_secs;
544 8932 framecnt=0;
545 8932 }
546
547 END_OF_FUNCTION(fps_callback)
548
549 13 int32_t Z_init_timers()
550 {
551 static bool didit = false;
552 const static char *err_str = "Couldn't allocate timer";
553 13 err_str = err_str; //Unused variable warning
554
555
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if(didit)
556 return 1;
557
558 13 didit = true;
559
560 LOCK_VARIABLE(lastfps);
561 LOCK_VARIABLE(framecnt);
562 LOCK_FUNCTION(fps_callback);
563
564
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13 if(install_int_ex(fps_callback,SECS_TO_TIMER(1)))
565 return 0;
566
567 13 return 1;
568 13 }
569
570 void Z_remove_timers()
571 {
572 remove_int(fps_callback);
573 }
574
575 //----------------------------------------------------------------
576
577 void go()
578 {
579 scare_mouse();
580 blit(screen,tmp_scr,scrx,scry,0,0,screen->w,screen->h);
581 unscare_mouse();
582 }
583
584 void comeback()
585 {
586 scare_mouse();
587 blit(tmp_scr,screen,0,0,scrx,scry,screen->w,screen->h);
588 unscare_mouse();
589 }
590
591 void dump_pal(BITMAP *dest)
592 {
593 for(int32_t i=0; i<256; i++)
594 rectfill(dest,(i&63)<<2,(i&0xFC0)>>4,((i&63)<<2)+3,((i&0xFC0)>>4)+3,i);
595 }
596
597 //----------------------------------------------------------------
598
599 //Handles converting the mouse sprite from the .dat file
600 13 void load_mouse()
601 {
602 13 system_pal();
603 13 scare_mouse();
604 13 set_mouse_sprite(NULL);
605
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13 int32_t sz = vbound(int32_t(16*(is_large ? zc_get_config("zeldadx","cursor_scale_large",1.5) : zc_get_config("zeldadx","cursor_scale_small",1))),16,80);
606
2/2
✓ Branch 0 taken 52 times.
✓ Branch 1 taken 13 times.
65 for(int32_t j = 0; j < 4; ++j)
607 {
608 52 BITMAP* tmpbmp = create_bitmap_ex(8,16,16);
609 52 BITMAP* subbmp = create_bitmap_ex(8,16,16);
610
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
52 if(zcmouse[j])
611 destroy_bitmap(zcmouse[j]);
612 52 zcmouse[j] = create_bitmap_ex(8,sz,sz);
613 52 clear_bitmap(zcmouse[j]);
614 52 clear_bitmap(tmpbmp);
615 52 clear_bitmap(subbmp);
616 52 blit((BITMAP*)datafile[BMP_MOUSE].dat,tmpbmp,1,j*17+1,0,0,16,16);
617
2/2
✓ Branch 0 taken 832 times.
✓ Branch 1 taken 52 times.
884 for(int32_t x = 0; x < 16; ++x)
618 {
619
2/2
✓ Branch 0 taken 13312 times.
✓ Branch 1 taken 832 times.
14144 for(int32_t y = 0; y < 16; ++y)
620 {
621 13312 int32_t color = getpixel(tmpbmp, x, y);
622
5/5
✓ Branch 0 taken 12246 times.
✓ Branch 1 taken 247 times.
✓ Branch 2 taken 286 times.
✓ Branch 3 taken 299 times.
✓ Branch 4 taken 234 times.
13312 switch(color)
623 {
624 case dvc(1):
625 247 color = jwin_pal[jcCURSORMISC];
626 247 break;
627 case dvc(2):
628 286 color = jwin_pal[jcCURSOROUTLINE];
629 286 break;
630 case dvc(3):
631 299 color = jwin_pal[jcCURSORLIGHT];
632 299 break;
633 case dvc(5):
634 234 color = jwin_pal[jcCURSORDARK];
635 234 break;
636 }
637 13312 putpixel(subbmp, x, y, color);
638 13312 }
639 832 }
640
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
52 if(sz!=16)
641 52 stretch_blit(subbmp, zcmouse[j], 0, 0, 16, 16, 0, 0, sz, sz);
642 else
643 blit(subbmp, zcmouse[j], 0, 0, 0, 0, 16, 16);
644 52 destroy_bitmap(tmpbmp);
645 52 destroy_bitmap(subbmp);
646 52 }
647 13 set_mouse_sprite(zcmouse[0]);
648
649 // Must attempt to show cursor for allegro 5 to render it with the associated palette.
650 13 set_palette(*hw_palette);
651 13 show_mouse(screen);
652 13 show_mouse(NULL);
653
654 13 unscare_mouse();
655 13 game_pal();
656 13 }
657
658 // sets the video mode and initializes the palette and mouse sprite
659 13 bool game_vid_mode(int32_t mode,int32_t wait)
660 {
661
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if(set_gfx_mode(mode,resx,resy,0,0)!=0)
662 {
663 return false;
664 }
665
666 13 scrx = (resx-320)>>1;
667 13 scry = (resy-240)>>1;
668
2/2
✓ Branch 0 taken 52 times.
✓ Branch 1 taken 13 times.
65 for(int32_t q = 0; q < 4; ++q)
669 52 zcmouse[q] = NULL;
670 13 load_mouse();
671 13 set_mouse_sprite(zcmouse[0]);
672
673
2/2
✓ Branch 0 taken 208 times.
✓ Branch 1 taken 13 times.
221 for(int32_t i=240; i<256; i++)
674 208 RAMpal[i]=((RGB*)datafile[PAL_GUI].dat)[i];
675
676 13 set_palette(RAMpal);
677 13 clear_to_color(screen,BLACK);
678
679 13 rest(wait);
680 13 return true;
681 13 }
682
683 2 void null_quest()
684 {
685 char qstdat_string[2048];
686 2 strcpy(qstdat_string,moduledata.datafiles[qst_dat]);
687 2 strcat(qstdat_string,"#NESQST_NEW_QST");
688
689 #ifdef __EMSCRIPTEN__
690 // The quest template data file is not included because it's really big and isn't really needed
691 // for the player, except to initialize some graphics. Those same graphics exist in this quest file,
692 // which is much smaller.
693 strcpy(qstdat_string, "modules/classic/title_gfx.dat");
694 #endif
695
696 2 byte skip_flags[4] = { 0 };
697
698 2 loadquest(qstdat_string,&QHeader,&QMisc,tunes+ZC_MIDI_COUNT,false,true,true,true,skip_flags,0,false);
699 2 }
700
701 2 void init_NES_mode()
702 {
703 /*
704 // qst.dat may not load correctly without this...
705 QHeader.templatepath[0]='\0';
706
707 if(!init_colordata(true, &QHeader, &QMisc))
708 {
709 return;
710 }
711
712 loadfullpal();
713 init_tiles(false, &QHeader);
714 */
715 2 null_quest();
716 2 }
717
718 //----------------------------------------------------------------
719
720 qword trianglelines[16]=
721 {
722 0x0000000000000000ULL,
723 0xFD00000000000000ULL,
724 0xFDFD000000000000ULL,
725 0xFDFDFD0000000000ULL,
726 0xFDFDFDFD00000000ULL,
727 0xFDFDFDFDFD000000ULL,
728 0xFDFDFDFDFDFD0000ULL,
729 0xFDFDFDFDFDFDFD00ULL,
730 0xFDFDFDFDFDFDFDFDULL,
731 0x00FDFDFDFDFDFDFDULL,
732 0x0000FDFDFDFDFDFDULL,
733 0x000000FDFDFDFDFDULL,
734 0x00000000FDFDFDFDULL,
735 0x0000000000FDFDFDULL,
736 0x000000000000FDFDULL,
737 0x00000000000000FDULL,
738 };
739
740 word screen_triangles[28][32];
741 /*
742 qword triangles[4][16]= //[direction][value]
743 {
744 {
745 0x00000000, 0x10000000, 0x21000000, 0x32100000, 0x43210000, 0x54321000, 0x65432100, 0x76543210, 0x87654321, 0x88765432, 0x88876543, 0x88887654, 0x88888765, 0x88888876, 0x88888887, 0x88888888
746 },
747 {
748 0x00000000, 0xF0000000, 0xEF000000, 0xFDF00000, 0xCFDF0000, 0xBCFDF000, 0xABCFDF00, 0x9ABCFDF0, 0x89ABCFDF, 0x889ABCFD, 0x8889ABCD, 0x88889ABC, 0x888889AB, 0x8888889A, 0x88888889, 0x88888888
749 },
750 {
751 0x00000000, 0x00000001, 0x00000012, 0x00000123, 0x00001234, 0x00012345, 0x00123456, 0x01234567, 0x12345678, 0x23456788, 0x34567888, 0x45678888, 0x56788888, 0x67888888, 0x78888888, 0x88888888
752 },
753 {
754 0x00000000, 0x0000000F, 0x000000FE, 0x00000FED, 0x0000FEDC, 0x000FEDCB, 0x00FEDCBA, 0x0FEDCBA9, 0xFEDCBA98, 0xEDCBA988, 0xDCBA9888, 0xCBA98888, 0xBA988888, 0xA9888888, 0x98888888, 0x88888888
755 }
756 };
757 */
758
759
760 /*
761 byte triangles[4][16][8]= //[direction][value][line]
762 {
763 {
764 {
765 0, 0, 0, 0, 0, 0, 0, 0
766 },
767 {
768 1, 0, 0, 0, 0, 0, 0, 0
769 },
770 {
771 2, 1, 0, 0, 0, 0, 0, 0
772 },
773 {
774 3, 2, 1, 0, 0, 0, 0, 0
775 },
776 {
777 4, 3, 2, 1, 0, 0, 0, 0
778 },
779 {
780 5, 4, 3, 2, 1, 0, 0, 0
781 },
782 {
783 6, 5, 4, 3, 2, 1, 0, 0
784 },
785 {
786 7, 6, 5, 4, 3, 2, 1, 0
787 },
788 {
789 8, 7, 6, 5, 4, 3, 2, 1
790 },
791 {
792 8, 8, 7, 6, 5, 4, 3, 2
793 },
794 {
795 8, 8, 8, 7, 6, 5, 4, 3
796 },
797 {
798 8, 8, 8, 8, 7, 6, 5, 4
799 },
800 {
801 8, 8, 8, 8, 8, 7, 6, 5
802 },
803 {
804 8, 8, 8, 8, 8, 8, 7, 6
805 },
806 {
807 8, 8, 8, 8, 8, 8, 8, 7
808 },
809 {
810 8, 8, 8, 8, 8, 8, 8, 8
811 }
812 },
813 {
814 {
815 0, 0, 0, 0, 0, 0, 0, 0
816 },
817 {
818 15, 0, 0, 0, 0, 0, 0, 0
819 },
820 {
821 14, 15, 0, 0, 0, 0, 0, 0
822 },
823 {
824 13, 14, 15, 0, 0, 0, 0, 0
825 },
826 {
827 12, 13, 14, 15, 0, 0, 0, 0
828 },
829 {
830 11, 12, 13, 14, 15, 0, 0, 0
831 },
832 {
833 10, 11, 12, 13, 14, 15, 0, 0
834 },
835 {
836 9, 10, 11, 12, 13, 14, 15, 0
837 },
838 {
839 8, 9, 10, 11, 12, 13, 14, 15
840 },
841 {
842 8, 8, 9, 10, 11, 12, 13, 14
843 },
844 {
845 8, 8, 8, 9, 10, 11, 12, 13
846 },
847 {
848 8, 8, 8, 8, 9, 10, 11, 12
849 },
850 {
851 8, 8, 8, 8, 8, 9, 10, 11
852 },
853 {
854 8, 8, 8, 8, 8, 8, 9, 10
855 },
856 {
857 8, 8, 8, 8, 8, 8, 8, 9
858 },
859 {
860 8, 8, 8, 8, 8, 8, 8, 8
861 }
862 },
863 {
864 {
865 0, 0, 0, 0, 0, 0, 0, 0
866 },
867 {
868 0, 0, 0, 0, 0, 0, 0, 1
869 },
870 {
871 0, 0, 0, 0, 0, 0, 1, 2
872 },
873 {
874 0, 0, 0, 0, 0, 1, 2, 3
875 },
876 {
877 0, 0, 0, 0, 1, 2, 3, 4
878 },
879 {
880 0, 0, 0, 1, 2, 3, 4, 5
881 },
882 {
883 0, 0, 1, 2, 3, 4, 5, 6
884 },
885 {
886 0, 1, 2, 3, 4, 5, 6, 7
887 },
888 {
889 1, 2, 3, 4, 5, 6, 7, 8
890 },
891 {
892 2, 3, 4, 5, 6, 7, 8, 8
893 },
894 {
895 3, 4, 5, 6, 7, 8, 8, 8
896 },
897 {
898 4, 5, 6, 7, 8, 8, 8, 8
899 },
900 {
901 5, 6, 7, 8, 8, 8, 8, 8
902 },
903 {
904 6, 7, 8, 8, 8, 8, 8, 8
905 },
906 {
907 7, 8, 8, 8, 8, 8, 8, 8
908 },
909 {
910 8, 8, 8, 8, 8, 8, 8, 8
911 }
912 },
913 {
914 {
915 0, 0, 0, 0, 0, 0, 0, 0
916 },
917 {
918 0, 0, 0, 0, 0, 0, 0, 15
919 },
920 {
921 0, 0, 0, 0, 0, 0, 15, 14
922 },
923 {
924 0, 0, 0, 0, 0, 15, 14, 13
925 },
926 {
927 0, 0, 0, 0, 15, 14, 13, 12
928 },
929 {
930 0, 0, 0, 15, 14, 13, 12, 11
931 },
932 {
933 0, 0, 15, 14, 13, 12, 11, 10
934 },
935 {
936 0, 15, 14, 13, 12, 11, 10, 9
937 },
938 {
939 15, 14, 13, 12, 11, 10, 9, 8
940 },
941 {
942 14, 13, 12, 11, 10, 9, 8, 8
943 },
944 {
945 13, 12, 11, 10, 9, 8, 8, 8
946 },
947 {
948 12, 11, 10, 9, 8, 8, 8, 8
949 },
950 {
951 11, 10, 9, 8, 8, 8, 8, 8
952 },
953 {
954 10, 9, 8, 8, 8, 8, 8, 8
955 },
956 {
957 9, 8, 8, 8, 8, 8, 8, 8
958 },
959 {
960 8, 8, 8, 8, 8, 8, 8, 8
961 }
962 }
963 };
964 */
965
966
967
968 /*
969 for (int32_t blockrow=0; blockrow<30; ++i)
970 {
971 for (int32_t linerow=0; linerow<8; ++i)
972 {
973 qword *triangleline=(qword*)(tmp_scr->line[(blockrow*8+linerow)]);
974 for (int32_t blockcolumn=0; blockcolumn<40; ++i)
975 {
976 triangleline=triangles[0][screen_triangles[blockrow][blockcolumn]][linerow];
977 ++triangleline;
978 }
979 }
980 }
981 */
982
983 // the ULL suffixes are to prevent this warning:
984 // warning: integer constant is too large for "int32_t" type
985
986 qword triangles[4][16][8]= //[direction][value][line]
987 {
988 {
989 {
990 0x0000000000000000ULL,
991 0x0000000000000000ULL,
992 0x0000000000000000ULL,
993 0x0000000000000000ULL,
994 0x0000000000000000ULL,
995 0x0000000000000000ULL,
996 0x0000000000000000ULL,
997 0x0000000000000000ULL
998 },
999 {
1000 0xFD00000000000000ULL,
1001 0x0000000000000000ULL,
1002 0x0000000000000000ULL,
1003 0x0000000000000000ULL,
1004 0x0000000000000000ULL,
1005 0x0000000000000000ULL,
1006 0x0000000000000000ULL,
1007 0x0000000000000000ULL
1008 },
1009 {
1010 0xFDFD000000000000ULL,
1011 0xFD00000000000000ULL,
1012 0x0000000000000000ULL,
1013 0x0000000000000000ULL,
1014 0x0000000000000000ULL,
1015 0x0000000000000000ULL,
1016 0x0000000000000000ULL,
1017 0x0000000000000000ULL
1018 },
1019 {
1020 0xFDFDFD0000000000ULL,
1021 0xFDFD000000000000ULL,
1022 0xFD00000000000000ULL,
1023 0x0000000000000000ULL,
1024 0x0000000000000000ULL,
1025 0x0000000000000000ULL,
1026 0x0000000000000000ULL,
1027 0x0000000000000000ULL
1028 },
1029 {
1030 0xFDFDFDFD00000000ULL,
1031 0xFDFDFD0000000000ULL,
1032 0xFDFD000000000000ULL,
1033 0xFD00000000000000ULL,
1034 0x0000000000000000ULL,
1035 0x0000000000000000ULL,
1036 0x0000000000000000ULL,
1037 0x0000000000000000ULL
1038 },
1039 {
1040 0xFDFDFDFDFD000000ULL,
1041 0xFDFDFDFD00000000ULL,
1042 0xFDFDFD0000000000ULL,
1043 0xFDFD000000000000ULL,
1044 0xFD00000000000000ULL,
1045 0x0000000000000000ULL,
1046 0x0000000000000000ULL,
1047 0x0000000000000000ULL
1048 },
1049 {
1050 0xFDFDFDFDFDFD0000ULL,
1051 0xFDFDFDFDFD000000ULL,
1052 0xFDFDFDFD00000000ULL,
1053 0xFDFDFD0000000000ULL,
1054 0xFDFD000000000000ULL,
1055 0xFD00000000000000ULL,
1056 0x0000000000000000ULL,
1057 0x0000000000000000ULL
1058 },
1059 {
1060 0xFDFDFDFDFDFDFD00ULL,
1061 0xFDFDFDFDFDFD0000ULL,
1062 0xFDFDFDFDFD000000ULL,
1063 0xFDFDFDFD00000000ULL,
1064 0xFDFDFD0000000000ULL,
1065 0xFDFD000000000000ULL,
1066 0xFD00000000000000ULL,
1067 0x0000000000000000ULL
1068 },
1069 {
1070 0xFDFDFDFDFDFDFDFDULL,
1071 0xFDFDFDFDFDFDFD00ULL,
1072 0xFDFDFDFDFDFD0000ULL,
1073 0xFDFDFDFDFD000000ULL,
1074 0xFDFDFDFD00000000ULL,
1075 0xFDFDFD0000000000ULL,
1076 0xFDFD000000000000ULL,
1077 0xFD00000000000000ULL
1078 },
1079 {
1080 0xFDFDFDFDFDFDFDFDULL,
1081 0xFDFDFDFDFDFDFDFDULL,
1082 0xFDFDFDFDFDFDFD00ULL,
1083 0xFDFDFDFDFDFD0000ULL,
1084 0xFDFDFDFDFD000000ULL,
1085 0xFDFDFDFD00000000ULL,
1086 0xFDFDFD0000000000ULL,
1087 0xFDFD000000000000ULL
1088 },
1089 {
1090 0xFDFDFDFDFDFDFDFDULL,
1091 0xFDFDFDFDFDFDFDFDULL,
1092 0xFDFDFDFDFDFDFDFDULL,
1093 0xFDFDFDFDFDFDFD00ULL,
1094 0xFDFDFDFDFDFD0000ULL,
1095 0xFDFDFDFDFD000000ULL,
1096 0xFDFDFDFD00000000ULL,
1097 0xFDFDFD0000000000ULL
1098 },
1099 {
1100 0xFDFDFDFDFDFDFDFDULL,
1101 0xFDFDFDFDFDFDFDFDULL,
1102 0xFDFDFDFDFDFDFDFDULL,
1103 0xFDFDFDFDFDFDFDFDULL,
1104 0xFDFDFDFDFDFDFD00ULL,
1105 0xFDFDFDFDFDFD0000ULL,
1106 0xFDFDFDFDFD000000ULL,
1107 0xFDFDFDFD00000000ULL
1108 },
1109 {
1110 0xFDFDFDFDFDFDFDFDULL,
1111 0xFDFDFDFDFDFDFDFDULL,
1112 0xFDFDFDFDFDFDFDFDULL,
1113 0xFDFDFDFDFDFDFDFDULL,
1114 0xFDFDFDFDFDFDFDFDULL,
1115 0xFDFDFDFDFDFDFD00ULL,
1116 0xFDFDFDFDFDFD0000ULL,
1117 0xFDFDFDFDFD000000ULL
1118 },
1119 {
1120 0xFDFDFDFDFDFDFDFDULL,
1121 0xFDFDFDFDFDFDFDFDULL,
1122 0xFDFDFDFDFDFDFDFDULL,
1123 0xFDFDFDFDFDFDFDFDULL,
1124 0xFDFDFDFDFDFDFDFDULL,
1125 0xFDFDFDFDFDFDFDFDULL,
1126 0xFDFDFDFDFDFDFD00ULL,
1127 0xFDFDFDFDFDFD0000ULL
1128 },
1129 {
1130 0xFDFDFDFDFDFDFDFDULL,
1131 0xFDFDFDFDFDFDFDFDULL,
1132 0xFDFDFDFDFDFDFDFDULL,
1133 0xFDFDFDFDFDFDFDFDULL,
1134 0xFDFDFDFDFDFDFDFDULL,
1135 0xFDFDFDFDFDFDFDFDULL,
1136 0xFDFDFDFDFDFDFDFDULL,
1137 0xFDFDFDFDFDFDFD00ULL
1138 },
1139 {
1140 0xFDFDFDFDFDFDFDFDULL,
1141 0xFDFDFDFDFDFDFDFDULL,
1142 0xFDFDFDFDFDFDFDFDULL,
1143 0xFDFDFDFDFDFDFDFDULL,
1144 0xFDFDFDFDFDFDFDFDULL,
1145 0xFDFDFDFDFDFDFDFDULL,
1146 0xFDFDFDFDFDFDFDFDULL,
1147 0xFDFDFDFDFDFDFDFDULL
1148 }
1149 },
1150 {
1151 {
1152 0x0000000000000000ULL,
1153 0x0000000000000000ULL,
1154 0x0000000000000000ULL,
1155 0x0000000000000000ULL,
1156 0x0000000000000000ULL,
1157 0x0000000000000000ULL,
1158 0x0000000000000000ULL,
1159 0x0000000000000000ULL
1160 },
1161 {
1162 0x00000000000000FDULL,
1163 0x0000000000000000ULL,
1164 0x0000000000000000ULL,
1165 0x0000000000000000ULL,
1166 0x0000000000000000ULL,
1167 0x0000000000000000ULL,
1168 0x0000000000000000ULL,
1169 0x0000000000000000ULL
1170 },
1171 {
1172 0x000000000000FDFDULL,
1173 0x00000000000000FDULL,
1174 0x0000000000000000ULL,
1175 0x0000000000000000ULL,
1176 0x0000000000000000ULL,
1177 0x0000000000000000ULL,
1178 0x0000000000000000ULL,
1179 0x0000000000000000ULL
1180 },
1181 {
1182 0x0000000000FDFDFDULL,
1183 0x000000000000FDFDULL,
1184 0x00000000000000FDULL,
1185 0x0000000000000000ULL,
1186 0x0000000000000000ULL,
1187 0x0000000000000000ULL,
1188 0x0000000000000000ULL,
1189 0x0000000000000000ULL
1190 },
1191 {
1192 0x00000000FDFDFDFDULL,
1193 0x0000000000FDFDFDULL,
1194 0x000000000000FDFDULL,
1195 0x00000000000000FDULL,
1196 0x0000000000000000ULL,
1197 0x0000000000000000ULL,
1198 0x0000000000000000ULL,
1199 0x0000000000000000ULL
1200 },
1201 {
1202 0x000000FDFDFDFDFDULL,
1203 0x00000000FDFDFDFDULL,
1204 0x0000000000FDFDFDULL,
1205 0x000000000000FDFDULL,
1206 0x00000000000000FDULL,
1207 0x0000000000000000ULL,
1208 0x0000000000000000ULL,
1209 0x0000000000000000ULL
1210 },
1211 {
1212 0x0000FDFDFDFDFDFDULL,
1213 0x000000FDFDFDFDFDULL,
1214 0x00000000FDFDFDFDULL,
1215 0x0000000000FDFDFDULL,
1216 0x000000000000FDFDULL,
1217 0x00000000000000FDULL,
1218 0x0000000000000000ULL,
1219 0x0000000000000000ULL
1220 },
1221 {
1222 0x00FDFDFDFDFDFDFDULL,
1223 0x0000FDFDFDFDFDFDULL,
1224 0x000000FDFDFDFDFDULL,
1225 0x00000000FDFDFDFDULL,
1226 0x0000000000FDFDFDULL,
1227 0x000000000000FDFDULL,
1228 0x00000000000000FDULL,
1229 0x0000000000000000ULL
1230 },
1231 {
1232 0xFDFDFDFDFDFDFDFDULL,
1233 0x00FDFDFDFDFDFDFDULL,
1234 0x0000FDFDFDFDFDFDULL,
1235 0x000000FDFDFDFDFDULL,
1236 0x00000000FDFDFDFDULL,
1237 0x0000000000FDFDFDULL,
1238 0x000000000000FDFDULL,
1239 0x00000000000000FDULL
1240 },
1241 {
1242 0xFDFDFDFDFDFDFDFDULL,
1243 0xFDFDFDFDFDFDFDFDULL,
1244 0x00FDFDFDFDFDFDFDULL,
1245 0x0000FDFDFDFDFDFDULL,
1246 0x000000FDFDFDFDFDULL,
1247 0x00000000FDFDFDFDULL,
1248 0x0000000000FDFDFDULL,
1249 0x000000000000FDFDULL
1250 },
1251 {
1252 0xFDFDFDFDFDFDFDFDULL,
1253 0xFDFDFDFDFDFDFDFDULL,
1254 0xFDFDFDFDFDFDFDFDULL,
1255 0x00FDFDFDFDFDFDFDULL,
1256 0x0000FDFDFDFDFDFDULL,
1257 0x000000FDFDFDFDFDULL,
1258 0x00000000FDFDFDFDULL,
1259 0x0000000000FDFDFDULL
1260 },
1261 {
1262 0xFDFDFDFDFDFDFDFDULL,
1263 0xFDFDFDFDFDFDFDFDULL,
1264 0xFDFDFDFDFDFDFDFDULL,
1265 0xFDFDFDFDFDFDFDFDULL,
1266 0x00FDFDFDFDFDFDFDULL,
1267 0x0000FDFDFDFDFDFDULL,
1268 0x000000FDFDFDFDFDULL,
1269 0x00000000FDFDFDFDULL
1270 },
1271 {
1272 0xFDFDFDFDFDFDFDFDULL,
1273 0xFDFDFDFDFDFDFDFDULL,
1274 0xFDFDFDFDFDFDFDFDULL,
1275 0xFDFDFDFDFDFDFDFDULL,
1276 0xFDFDFDFDFDFDFDFDULL,
1277 0x00FDFDFDFDFDFDFDULL,
1278 0x0000FDFDFDFDFDFDULL,
1279 0x000000FDFDFDFDFDULL
1280 },
1281 {
1282 0xFDFDFDFDFDFDFDFDULL,
1283 0xFDFDFDFDFDFDFDFDULL,
1284 0xFDFDFDFDFDFDFDFDULL,
1285 0xFDFDFDFDFDFDFDFDULL,
1286 0xFDFDFDFDFDFDFDFDULL,
1287 0xFDFDFDFDFDFDFDFDULL,
1288 0x00FDFDFDFDFDFDFDULL,
1289 0x0000FDFDFDFDFDFDULL
1290 },
1291 {
1292 0xFDFDFDFDFDFDFDFDULL,
1293 0xFDFDFDFDFDFDFDFDULL,
1294 0xFDFDFDFDFDFDFDFDULL,
1295 0xFDFDFDFDFDFDFDFDULL,
1296 0xFDFDFDFDFDFDFDFDULL,
1297 0xFDFDFDFDFDFDFDFDULL,
1298 0xFDFDFDFDFDFDFDFDULL,
1299 0x00FDFDFDFDFDFDFDULL
1300 },
1301 {
1302 0xFDFDFDFDFDFDFDFDULL,
1303 0xFDFDFDFDFDFDFDFDULL,
1304 0xFDFDFDFDFDFDFDFDULL,
1305 0xFDFDFDFDFDFDFDFDULL,
1306 0xFDFDFDFDFDFDFDFDULL,
1307 0xFDFDFDFDFDFDFDFDULL,
1308 0xFDFDFDFDFDFDFDFDULL,
1309 0xFDFDFDFDFDFDFDFDULL
1310 }
1311 },
1312 {
1313 {
1314 0x0000000000000000ULL,
1315 0x0000000000000000ULL,
1316 0x0000000000000000ULL,
1317 0x0000000000000000ULL,
1318 0x0000000000000000ULL,
1319 0x0000000000000000ULL,
1320 0x0000000000000000ULL,
1321 0x0000000000000000ULL
1322 },
1323 {
1324 0x0000000000000000ULL,
1325 0x0000000000000000ULL,
1326 0x0000000000000000ULL,
1327 0x0000000000000000ULL,
1328 0x0000000000000000ULL,
1329 0x0000000000000000ULL,
1330 0x0000000000000000ULL,
1331 0xFD00000000000000ULL
1332 },
1333 {
1334 0x0000000000000000ULL,
1335 0x0000000000000000ULL,
1336 0x0000000000000000ULL,
1337 0x0000000000000000ULL,
1338 0x0000000000000000ULL,
1339 0x0000000000000000ULL,
1340 0xFD00000000000000ULL,
1341 0xFDFD000000000000ULL
1342 },
1343 {
1344 0x0000000000000000ULL,
1345 0x0000000000000000ULL,
1346 0x0000000000000000ULL,
1347 0x0000000000000000ULL,
1348 0x0000000000000000ULL,
1349 0xFD00000000000000ULL,
1350 0xFDFD000000000000ULL,
1351 0xFDFDFD0000000000ULL
1352 },
1353 {
1354 0x0000000000000000ULL,
1355 0x0000000000000000ULL,
1356 0x0000000000000000ULL,
1357 0x0000000000000000ULL,
1358 0xFD00000000000000ULL,
1359 0xFDFD000000000000ULL,
1360 0xFDFDFD0000000000ULL,
1361 0xFDFDFDFD00000000ULL
1362 },
1363 {
1364 0x0000000000000000ULL,
1365 0x0000000000000000ULL,
1366 0x0000000000000000ULL,
1367 0xFD00000000000000ULL,
1368 0xFDFD000000000000ULL,
1369 0xFDFDFD0000000000ULL,
1370 0xFDFDFDFD00000000ULL,
1371 0xFDFDFDFDFD000000ULL
1372 },
1373 {
1374 0x0000000000000000ULL,
1375 0x0000000000000000ULL,
1376 0xFD00000000000000ULL,
1377 0xFDFD000000000000ULL,
1378 0xFDFDFD0000000000ULL,
1379 0xFDFDFDFD00000000ULL,
1380 0xFDFDFDFDFD000000ULL,
1381 0xFDFDFDFDFDFD0000ULL
1382 },
1383 {
1384 0x0000000000000000ULL,
1385 0xFD00000000000000ULL,
1386 0xFDFD000000000000ULL,
1387 0xFDFDFD0000000000ULL,
1388 0xFDFDFDFD00000000ULL,
1389 0xFDFDFDFDFD000000ULL,
1390 0xFDFDFDFDFDFD0000ULL,
1391 0xFDFDFDFDFDFDFD00ULL
1392 },
1393 {
1394 0xFD00000000000000ULL,
1395 0xFDFD000000000000ULL,
1396 0xFDFDFD0000000000ULL,
1397 0xFDFDFDFD00000000ULL,
1398 0xFDFDFDFDFD000000ULL,
1399 0xFDFDFDFDFDFD0000ULL,
1400 0xFDFDFDFDFDFDFD00ULL,
1401 0xFDFDFDFDFDFDFDFDULL
1402 },
1403 {
1404 0xFDFD000000000000ULL,
1405 0xFDFDFD0000000000ULL,
1406 0xFDFDFDFD00000000ULL,
1407 0xFDFDFDFDFD000000ULL,
1408 0xFDFDFDFDFDFD0000ULL,
1409 0xFDFDFDFDFDFDFD00ULL,
1410 0xFDFDFDFDFDFDFDFDULL,
1411 0xFDFDFDFDFDFDFDFDULL
1412 },
1413 {
1414 0xFDFDFD0000000000ULL,
1415 0xFDFDFDFD00000000ULL,
1416 0xFDFDFDFDFD000000ULL,
1417 0xFDFDFDFDFDFD0000ULL,
1418 0xFDFDFDFDFDFDFD00ULL,
1419 0xFDFDFDFDFDFDFDFDULL,
1420 0xFDFDFDFDFDFDFDFDULL,
1421 0xFDFDFDFDFDFDFDFDULL
1422 },
1423 {
1424 0xFDFDFDFD00000000ULL,
1425 0xFDFDFDFDFD000000ULL,
1426 0xFDFDFDFDFDFD0000ULL,
1427 0xFDFDFDFDFDFDFD00ULL,
1428 0xFDFDFDFDFDFDFDFDULL,
1429 0xFDFDFDFDFDFDFDFDULL,
1430 0xFDFDFDFDFDFDFDFDULL,
1431 0xFDFDFDFDFDFDFDFDULL
1432 },
1433 {
1434 0xFDFDFDFDFD000000ULL,
1435 0xFDFDFDFDFDFD0000ULL,
1436 0xFDFDFDFDFDFDFD00ULL,
1437 0xFDFDFDFDFDFDFDFDULL,
1438 0xFDFDFDFDFDFDFDFDULL,
1439 0xFDFDFDFDFDFDFDFDULL,
1440 0xFDFDFDFDFDFDFDFDULL,
1441 0xFDFDFDFDFDFDFDFDULL
1442 },
1443 {
1444 0xFDFDFDFDFDFD0000ULL,
1445 0xFDFDFDFDFDFDFD00ULL,
1446 0xFDFDFDFDFDFDFDFDULL,
1447 0xFDFDFDFDFDFDFDFDULL,
1448 0xFDFDFDFDFDFDFDFDULL,
1449 0xFDFDFDFDFDFDFDFDULL,
1450 0xFDFDFDFDFDFDFDFDULL,
1451 0xFDFDFDFDFDFDFDFDULL
1452 },
1453 {
1454 0xFDFDFDFDFDFDFD00ULL,
1455 0xFDFDFDFDFDFDFDFDULL,
1456 0xFDFDFDFDFDFDFDFDULL,
1457 0xFDFDFDFDFDFDFDFDULL,
1458 0xFDFDFDFDFDFDFDFDULL,
1459 0xFDFDFDFDFDFDFDFDULL,
1460 0xFDFDFDFDFDFDFDFDULL,
1461 0xFDFDFDFDFDFDFDFDULL
1462 },
1463 {
1464 0xFDFDFDFDFDFDFDFDULL,
1465 0xFDFDFDFDFDFDFDFDULL,
1466 0xFDFDFDFDFDFDFDFDULL,
1467 0xFDFDFDFDFDFDFDFDULL,
1468 0xFDFDFDFDFDFDFDFDULL,
1469 0xFDFDFDFDFDFDFDFDULL,
1470 0xFDFDFDFDFDFDFDFDULL,
1471 0xFDFDFDFDFDFDFDFDULL
1472 }
1473 },
1474 {
1475 {
1476 0x0000000000000000ULL,
1477 0x0000000000000000ULL,
1478 0x0000000000000000ULL,
1479 0x0000000000000000ULL,
1480 0x0000000000000000ULL,
1481 0x0000000000000000ULL,
1482 0x0000000000000000ULL,
1483 0x0000000000000000ULL
1484 },
1485 {
1486 0x0000000000000000ULL,
1487 0x0000000000000000ULL,
1488 0x0000000000000000ULL,
1489 0x0000000000000000ULL,
1490 0x0000000000000000ULL,
1491 0x0000000000000000ULL,
1492 0x0000000000000000ULL,
1493 0x00000000000000FDULL
1494 },
1495 {
1496 0x0000000000000000ULL,
1497 0x0000000000000000ULL,
1498 0x0000000000000000ULL,
1499 0x0000000000000000ULL,
1500 0x0000000000000000ULL,
1501 0x0000000000000000ULL,
1502 0x00000000000000FDULL,
1503 0x000000000000FDFDULL
1504 },
1505 {
1506 0x0000000000000000ULL,
1507 0x0000000000000000ULL,
1508 0x0000000000000000ULL,
1509 0x0000000000000000ULL,
1510 0x0000000000000000ULL,
1511 0x00000000000000FDULL,
1512 0x000000000000FDFDULL,
1513 0x0000000000FDFDFDULL
1514 },
1515 {
1516 0x0000000000000000ULL,
1517 0x0000000000000000ULL,
1518 0x0000000000000000ULL,
1519 0x0000000000000000ULL,
1520 0x00000000000000FDULL,
1521 0x000000000000FDFDULL,
1522 0x0000000000FDFDFDULL,
1523 0x00000000FDFDFDFDULL
1524 },
1525 {
1526 0x0000000000000000ULL,
1527 0x0000000000000000ULL,
1528 0x0000000000000000ULL,
1529 0x00000000000000FDULL,
1530 0x000000000000FDFDULL,
1531 0x0000000000FDFDFDULL,
1532 0x00000000FDFDFDFDULL,
1533 0x000000FDFDFDFDFDULL
1534 },
1535 {
1536 0x0000000000000000ULL,
1537 0x0000000000000000ULL,
1538 0x00000000000000FDULL,
1539 0x000000000000FDFDULL,
1540 0x0000000000FDFDFDULL,
1541 0x00000000FDFDFDFDULL,
1542 0x000000FDFDFDFDFDULL,
1543 0x0000FDFDFDFDFDFDULL
1544 },
1545 {
1546 0x0000000000000000ULL,
1547 0x00000000000000FDULL,
1548 0x000000000000FDFDULL,
1549 0x0000000000FDFDFDULL,
1550 0x00000000FDFDFDFDULL,
1551 0x000000FDFDFDFDFDULL,
1552 0x0000FDFDFDFDFDFDULL,
1553 0x00FDFDFDFDFDFDFDULL
1554 },
1555 {
1556 0x00000000000000FDULL,
1557 0x000000000000FDFDULL,
1558 0x0000000000FDFDFDULL,
1559 0x00000000FDFDFDFDULL,
1560 0x000000FDFDFDFDFDULL,
1561 0x0000FDFDFDFDFDFDULL,
1562 0x00FDFDFDFDFDFDFDULL,
1563 0xFDFDFDFDFDFDFDFDULL
1564 },
1565 {
1566 0x000000000000FDFDULL,
1567 0x0000000000FDFDFDULL,
1568 0x00000000FDFDFDFDULL,
1569 0x000000FDFDFDFDFDULL,
1570 0x0000FDFDFDFDFDFDULL,
1571 0x00FDFDFDFDFDFDFDULL,
1572 0xFDFDFDFDFDFDFDFDULL,
1573 0xFDFDFDFDFDFDFDFDULL
1574 },
1575 {
1576 0x0000000000FDFDFDULL,
1577 0x00000000FDFDFDFDULL,
1578 0x000000FDFDFDFDFDULL,
1579 0x0000FDFDFDFDFDFDULL,
1580 0x00FDFDFDFDFDFDFDULL,
1581 0xFDFDFDFDFDFDFDFDULL,
1582 0xFDFDFDFDFDFDFDFDULL,
1583 0xFDFDFDFDFDFDFDFDULL
1584 },
1585 {
1586 0x00000000FDFDFDFDULL,
1587 0x000000FDFDFDFDFDULL,
1588 0x0000FDFDFDFDFDFDULL,
1589 0x00FDFDFDFDFDFDFDULL,
1590 0xFDFDFDFDFDFDFDFDULL,
1591 0xFDFDFDFDFDFDFDFDULL,
1592 0xFDFDFDFDFDFDFDFDULL,
1593 0xFDFDFDFDFDFDFDFDULL
1594 },
1595 {
1596 0x000000FDFDFDFDFDULL,
1597 0x0000FDFDFDFDFDFDULL,
1598 0x00FDFDFDFDFDFDFDULL,
1599 0xFDFDFDFDFDFDFDFDULL,
1600 0xFDFDFDFDFDFDFDFDULL,
1601 0xFDFDFDFDFDFDFDFDULL,
1602 0xFDFDFDFDFDFDFDFDULL,
1603 0xFDFDFDFDFDFDFDFDULL
1604 },
1605 {
1606 0x0000FDFDFDFDFDFDULL,
1607 0x00FDFDFDFDFDFDFDULL,
1608 0xFDFDFDFDFDFDFDFDULL,
1609 0xFDFDFDFDFDFDFDFDULL,
1610 0xFDFDFDFDFDFDFDFDULL,
1611 0xFDFDFDFDFDFDFDFDULL,
1612 0xFDFDFDFDFDFDFDFDULL,
1613 0xFDFDFDFDFDFDFDFDULL
1614 },
1615 {
1616 0x00FDFDFDFDFDFDFDULL,
1617 0xFDFDFDFDFDFDFDFDULL,
1618 0xFDFDFDFDFDFDFDFDULL,
1619 0xFDFDFDFDFDFDFDFDULL,
1620 0xFDFDFDFDFDFDFDFDULL,
1621 0xFDFDFDFDFDFDFDFDULL,
1622 0xFDFDFDFDFDFDFDFDULL,
1623 0xFDFDFDFDFDFDFDFDULL
1624 },
1625 {
1626 0xFDFDFDFDFDFDFDFDULL,
1627 0xFDFDFDFDFDFDFDFDULL,
1628 0xFDFDFDFDFDFDFDFDULL,
1629 0xFDFDFDFDFDFDFDFDULL,
1630 0xFDFDFDFDFDFDFDFDULL,
1631 0xFDFDFDFDFDFDFDFDULL,
1632 0xFDFDFDFDFDFDFDFDULL,
1633 0xFDFDFDFDFDFDFDFDULL
1634 }
1635 }
1636 };
1637
1638 int32_t black_opening_count=0;
1639 int32_t black_opening_x,black_opening_y;
1640 int32_t black_opening_shape;
1641
1642 220 int32_t choose_opening_shape()
1643 {
1644 // First, count how many bits are set
1645 220 int32_t numBits=0;
1646 int32_t bitCounter;
1647
1648
2/2
✓ Branch 0 taken 1100 times.
✓ Branch 1 taken 220 times.
1320 for(int32_t i=0; i<bosMAX; i++)
1649 {
1650
2/2
✓ Branch 0 taken 880 times.
✓ Branch 1 taken 220 times.
1100 if(COOLSCROLL&(1<<i))
1651 220 numBits++;
1652 1100 }
1653
1654 // Shouldn't happen...
1655
1/2
✓ Branch 0 taken 220 times.
✗ Branch 1 not taken.
220 if(numBits==0)
1656 return bosCIRCLE;
1657
1658 // Pick a bit
1659 220 bitCounter=zc_rand()%numBits+1;
1660
1661
1/2
✓ Branch 0 taken 276 times.
✗ Branch 1 not taken.
276 for(int32_t i=0; i<bosMAX; i++)
1662 {
1663 // If this bit is set, decrement the bit counter
1664
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 220 times.
276 if(COOLSCROLL&(1<<i))
1665 220 bitCounter--;
1666
1667 // When the counter hits 0, return a value based on
1668 // which bit it stopped on.
1669 // Reminder: enum {bosCIRCLE=0, bosOVAL, bosTRIANGLE, bosSMAS, bosFADEBLACK, bosMAX};
1670
2/2
✓ Branch 0 taken 220 times.
✓ Branch 1 taken 56 times.
276 if(bitCounter==0)
1671 220 return i;
1672 56 }
1673
1674 // Shouldn't be necessary, but the compiler might complain, at least
1675 return bosCIRCLE;
1676 220 }
1677
1678 56 void close_black_opening(int32_t x, int32_t y, bool wait, int32_t shape)
1679 {
1680
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
56 black_opening_shape= (shape>-1 ? shape : choose_opening_shape());
1681
1682 56 int32_t w=256, h=224;
1683 56 int32_t blockrows=28, blockcolumns=32;
1684 56 int32_t xoffset=(x-(w/2))/8, yoffset=(y-(h/2))/8;
1685
1686
2/2
✓ Branch 0 taken 1568 times.
✓ Branch 1 taken 56 times.
1624 for(int32_t blockrow=0; blockrow<blockrows; ++blockrow) //30
1687 {
1688
2/2
✓ Branch 0 taken 50176 times.
✓ Branch 1 taken 1568 times.
51744 for(int32_t blockcolumn=0; blockcolumn<blockcolumns; ++blockcolumn) //40
1689 {
1690
2/2
✓ Branch 0 taken 27253 times.
✓ Branch 1 taken 22923 times.
50176 screen_triangles[blockrow][blockcolumn]=zc_max(abs(int32_t(double(blockcolumns-1)/2-blockcolumn+xoffset)),abs(int32_t(double(blockrows-1)/2-blockrow+yoffset)))|0x0100|((blockrow-yoffset<blockrows/2)?0:0x8000)|((blockcolumn-xoffset<blockcolumns/2)?0x4000:0);
1691 50176 }
1692 1568 }
1693
1694 56 black_opening_count = 66;
1695 56 black_opening_x = x;
1696 56 black_opening_y = y;
1697 56 lensclk = 0;
1698 //black_opening_shape=(black_opening_shape+1)%bosMAX;
1699
1700
1701
1/2
✓ Branch 0 taken 56 times.
✗ Branch 1 not taken.
56 if(black_opening_shape == bosFADEBLACK)
1702 {
1703 refreshTints();
1704 memcpy(tempblackpal, RAMpal, sizeof(RAMpal)); //Store palette in temp palette for fade effect
1705 }
1706
1/2
✓ Branch 0 taken 56 times.
✗ Branch 1 not taken.
56 if(wait)
1707 {
1708 FFCore.warpScriptCheck();
1709 for(int32_t i=0; i<66; i++)
1710 {
1711 draw_screen(tmpscr);
1712 //put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,false,sspUP);
1713 syskeys();
1714 advanceframe(true);
1715
1716 if(Quit)
1717 {
1718 break;
1719 }
1720 }
1721 }
1722 56 }
1723
1724 164 void open_black_opening(int32_t x, int32_t y, bool wait, int32_t shape)
1725 {
1726
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 164 times.
164 black_opening_shape= (shape>-1 ? shape : choose_opening_shape());
1727
1728 164 int32_t w=256, h=224;
1729 164 int32_t blockrows=28, blockcolumns=32;
1730 164 int32_t xoffset=(x-(w/2))/8, yoffset=(y-(h/2))/8;
1731
1732
2/2
✓ Branch 0 taken 4592 times.
✓ Branch 1 taken 164 times.
4756 for(int32_t blockrow=0; blockrow<blockrows; ++blockrow) //30
1733 {
1734
2/2
✓ Branch 0 taken 146944 times.
✓ Branch 1 taken 4592 times.
151536 for(int32_t blockcolumn=0; blockcolumn<blockcolumns; ++blockcolumn) //40
1735 {
1736
2/2
✓ Branch 0 taken 72769 times.
✓ Branch 1 taken 74175 times.
146944 screen_triangles[blockrow][blockcolumn]=zc_max(abs(int32_t(double(blockcolumns-1)/2-blockcolumn+xoffset)),abs(int32_t(double(blockrows-1)/2-blockrow+yoffset)))|0x0100|((blockrow-yoffset<blockrows/2)?0:0x8000)|((blockcolumn-xoffset<blockcolumns/2)?0x4000:0);
1737 146944 }
1738 4592 }
1739
1740 164 black_opening_count = -66;
1741 164 black_opening_x = x;
1742 164 black_opening_y = y;
1743 164 lensclk = 0;
1744
1/2
✓ Branch 0 taken 164 times.
✗ Branch 1 not taken.
164 if(black_opening_shape == bosFADEBLACK)
1745 {
1746 refreshTints();
1747 memcpy(tempblackpal, RAMpal, sizeof(RAMpal)); //Store palette in temp palette for fade effect
1748 }
1749
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 116 times.
164 if(wait)
1750 {
1751 116 FFCore.warpScriptCheck();
1752
2/2
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 7656 times.
7772 for(int32_t i=0; i<66; i++)
1753 {
1754 7656 draw_screen(tmpscr);
1755 //put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,false,sspUP);
1756 7656 syskeys();
1757 7656 advanceframe(true);
1758
1759
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7656 times.
7656 if(Quit)
1760 {
1761 break;
1762 }
1763 7656 }
1764 116 }
1765 164 }
1766
1767 14520 void black_opening(BITMAP *dest,int32_t x,int32_t y,int32_t a,int32_t max_a)
1768 {
1769 14520 clear_to_color(tmp_scr,BLACK);
1770 14520 int32_t w=256, h=224;
1771
1772
3/6
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
✓ Branch 3 taken 1188 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 13266 times.
14520 switch(black_opening_shape)
1773 {
1774 case bosOVAL:
1775 {
1776 double new_w=(w/2)+abs(w/2-x);
1777 double new_h=(h/2)+abs(h/2-y);
1778 double b=sqrt(((new_w*new_w)/4)+(new_h*new_h));
1779 ellipsefill(tmp_scr,x,y,int32_t(2*a*b/max_a)/8*8,int32_t(a*b/max_a)/8*8,0);
1780 break;
1781 }
1782
1783 case bosTRIANGLE:
1784 {
1785 66 double new_w=(w/2)+abs(w/2-x);
1786 66 double new_h=(h/2)+abs(h/2-y);
1787 66 double r=a*(new_w*sqrt((double)3)+new_h)/max_a;
1788 66 double P2= (PI/2);
1789 66 double P23=(2*PI/3);
1790 66 double P43=(4*PI/3);
1791 66 double Pa= (-4*PI*a/(3*max_a));
1792 66 double angle=P2+Pa;
1793 66 double a0=angle;
1794 66 double a2=angle+P23;
1795 66 double a4=angle+P43;
1796 132 triangle(tmp_scr, x+int32_t(zc::math::Cos(a0)*r), y-int32_t(zc::math::Sin(a0)*r),
1797 66 x+int32_t(zc::math::Cos(a2)*r), y-int32_t(zc::math::Sin(a2)*r),
1798 66 x+int32_t(zc::math::Cos(a4)*r), y-int32_t(zc::math::Sin(a4)*r),
1799 0);
1800 66 break;
1801 }
1802
1803 case bosSMAS:
1804 {
1805
2/2
✓ Branch 0 taken 462 times.
✓ Branch 1 taken 726 times.
1188 int32_t distance=zc_max(abs(w/2-x),abs(h/2-y))/8;
1806
1807
2/2
✓ Branch 0 taken 33264 times.
✓ Branch 1 taken 1188 times.
34452 for(int32_t blockrow=0; blockrow<28; ++blockrow) //30
1808 {
1809
2/2
✓ Branch 0 taken 266112 times.
✓ Branch 1 taken 33264 times.
299376 for(int32_t linerow=0; linerow<8; ++linerow)
1810 {
1811 266112 qword *triangleline=(qword*)(tmp_scr->line[(blockrow*8+linerow)]);
1812
1813
2/2
✓ Branch 0 taken 8515584 times.
✓ Branch 1 taken 266112 times.
8781696 for(int32_t blockcolumn=0; blockcolumn<32; ++blockcolumn) //40
1814 {
1815 25546752 *triangleline=triangles[(screen_triangles[blockrow][blockcolumn]&0xC000)>>14]
1816
6/6
✓ Branch 0 taken 5921664 times.
✓ Branch 1 taken 2593920 times.
✓ Branch 2 taken 5617144 times.
✓ Branch 3 taken 2898440 times.
✓ Branch 4 taken 3023224 times.
✓ Branch 5 taken 2593920 times.
8515584 [zc_min(zc_max((((31+distance)*(max_a-a)/max_a)+((screen_triangles[blockrow][blockcolumn]&0x0FFF)-0x0100)-(15+distance)),0),15)]
1817 8515584 [linerow];
1818 8515584 ++triangleline;
1819
1820
2/2
✓ Branch 0 taken 7451136 times.
✓ Branch 1 taken 1064448 times.
8515584 if(linerow==0)
1821 {
1822 1064448 }
1823 8515584 }
1824 266112 }
1825 33264 }
1826
1827 1188 break;
1828 }
1829
1830 case bosFADEBLACK:
1831 {
1832 if(black_opening_count<0)
1833 {
1834 black_fade(zc_min(-black_opening_count,63));
1835 }
1836 else if(black_opening_count>0)
1837 {
1838 black_fade(63-zc_max(black_opening_count-3,0));
1839 }
1840 else black_fade(0);
1841 return; //no blitting from tmp_scr!
1842 }
1843
1844 13266 case bosCIRCLE:
1845 default:
1846 {
1847 13266 double new_w=(w/2)+abs(w/2-x);
1848 13266 double new_h=(h/2)+abs(h/2-y);
1849 13266 int32_t r=int32_t(sqrt((new_w*new_w)+(new_h*new_h))*a/max_a);
1850 //circlefill(tmp_scr,x,y,a<<3,0);
1851 13266 circlefill(tmp_scr,x,y,r,0);
1852 13266 break;
1853 }
1854 }
1855
1856 14520 masked_blit(tmp_scr,dest,0,0,0,0,320,240);
1857 14520 }
1858
1859
1860 void black_fade(int32_t fadeamnt)
1861 {
1862 for(int32_t i=0; i < 0xEF; i++)
1863 {
1864 RAMpal[i].r = vbound(tempblackpal[i].r-fadeamnt,0,63);
1865 RAMpal[i].g = vbound(tempblackpal[i].g-fadeamnt,0,63);
1866 RAMpal[i].b = vbound(tempblackpal[i].b-fadeamnt,0,63);
1867 }
1868
1869 refreshpal = true;
1870 }
1871
1872 //----------------------------------------------------------------
1873
1874 8173858 bool item_disabled(int32_t item) //is this item disabled?
1875 {
1876
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8173858 times.
8173858 return (item>=0 && game->items_off[item] != 0);
1877 }
1878
1879 1792475 bool can_use_item(int32_t item_type, int32_t item) //can Hero use this item?
1880 {
1881
2/2
✓ Branch 0 taken 20760 times.
✓ Branch 1 taken 1771715 times.
1792475 if(current_item(item_type, true) >=item)
1882 {
1883 20760 return true;
1884 }
1885
1886 1771715 return false;
1887 1792475 }
1888
1889 8397643 bool has_item(int32_t item_type, int32_t it) //does Hero possess this item?
1890 {
1891
5/9
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 1255735 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 797248 times.
✓ Branch 6 taken 4764825 times.
✓ Branch 7 taken 1569691 times.
✓ Branch 8 taken 10144 times.
8397643 switch(item_type)
1892 {
1893 case itype_bomb:
1894 case itype_sbomb:
1895 {
1896 int32_t itemid = getItemID(itemsbuf, item_type, it);
1897
1898 if(itemid == -1)
1899 return false;
1900
1901 return (game->get_item(itemid));
1902 }
1903
1904 case itype_clock:
1905 {
1906 1255735 int32_t itemid = getItemID(itemsbuf, item_type, it);
1907
1908
2/4
✓ Branch 0 taken 1255735 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1255735 times.
✗ Branch 3 not taken.
1255735 if(itemid != -1 && (itemsbuf[itemid].flags & ITEM_FLAG1)) //Active clock
1909 return (game->get_item(itemid));
1910 1255735 return Hero.getClock()?1:0;
1911 }
1912
1913 case itype_key:
1914 return (game->get_keys()>0);
1915
1916 case itype_magiccontainer:
1917 return (game->get_maxmagic()>=game->get_mp_per_block());
1918
1919 case itype_triforcepiece: //it: -2=any, -1=current level, other=that level
1920 {
1921
1/3
✓ Branch 0 taken 797248 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
797248 switch(it)
1922 {
1923 case -2:
1924 {
1925 for(int32_t i=0; i<MAXLEVELS; i++)
1926 {
1927 if(game->lvlitems[i]&liTRIFORCE)
1928 {
1929 return true;
1930 }
1931 }
1932
1933 return false;
1934 }
1935
1936 case -1:
1937 return (game->lvlitems[dlevel]&liTRIFORCE);
1938
1939 default:
1940
2/4
✓ Branch 0 taken 797248 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 797248 times.
797248 if(it>=0&&it<MAXLEVELS)
1941 {
1942 797248 return (game->lvlitems[it]&liTRIFORCE);
1943 }
1944
1945 break;
1946 }
1947
1948 return 0;
1949 }
1950
1951 case itype_map: //it: -2=any, -1=current level, other=that level
1952 {
1953
1/3
✓ Branch 0 taken 4764825 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
4764825 switch(it)
1954 {
1955 case -2:
1956 {
1957 for(int32_t i=0; i<MAXLEVELS; i++)
1958 {
1959 if(game->lvlitems[i]&liMAP)
1960 {
1961 return true;
1962 }
1963 }
1964
1965 return false;
1966 }
1967
1968 case -1:
1969 return (game->lvlitems[dlevel]&liMAP)!=0;
1970
1971 default:
1972
2/4
✓ Branch 0 taken 4764825 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4764825 times.
4764825 if(it>=0&&it<MAXLEVELS)
1973 {
1974 4764825 return (game->lvlitems[it]&liMAP)!=0;
1975 }
1976
1977 break;
1978 }
1979
1980 return 0;
1981 }
1982
1983 case itype_compass: //it: -2=any, -1=current level, other=that level
1984 {
1985
1/3
✓ Branch 0 taken 1569691 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
1569691 switch(it)
1986 {
1987 case -2:
1988 {
1989 for(int32_t i=0; i<MAXLEVELS; i++)
1990 {
1991 if(game->lvlitems[i]&liCOMPASS)
1992 {
1993 return true;
1994 }
1995 }
1996
1997 return false;
1998 }
1999
2000 case -1:
2001 return (game->lvlitems[dlevel]&liCOMPASS)!=0;
2002
2003 default:
2004
2/4
✓ Branch 0 taken 1569691 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1569691 times.
✗ Branch 3 not taken.
1569691 if(it>=0&&it<MAXLEVELS)
2005 {
2006 1569691 return (game->lvlitems[it]&liCOMPASS)!=0;
2007 }
2008
2009 break;
2010 }
2011 return 0;
2012 }
2013
2014 case itype_bosskey: //it: -2=any, -1=current level, other=that level
2015 {
2016
1/3
✓ Branch 0 taken 10144 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
10144 switch(it)
2017 {
2018 case -2:
2019 {
2020 for(int32_t i=0; i<MAXLEVELS; i++)
2021 {
2022 if(game->lvlitems[i]&liBOSSKEY)
2023 {
2024 return true;
2025 }
2026 }
2027
2028 return false;
2029 }
2030
2031 case -1:
2032 return (game->lvlitems[dlevel]&liBOSSKEY)?1:0;
2033
2034 default:
2035
2/4
✓ Branch 0 taken 10144 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10144 times.
10144 if(it>=0&&it<MAXLEVELS)
2036 {
2037 10144 return (game->lvlitems[it]&liBOSSKEY)?1:0;
2038 }
2039 break;
2040 }
2041 return 0;
2042 }
2043
2044 default:
2045 //it=(1<<(it-1));
2046 /*if (item_type>=itype_max)
2047 {
2048 system_pal();
2049 jwin_alert("Error","has_item exception",NULL,NULL,"O&K",NULL,'k',0,lfont);
2050 game_pal();
2051
2052 return false;
2053 }*/
2054 int32_t itemid = getItemID(itemsbuf, item_type, it);
2055
2056 if(itemid == -1)
2057 return false;
2058
2059 return game->get_item(itemid);
2060 }
2061 8397643 }
2062
2063
2064 21809411 int32_t current_item(int32_t item_type, bool checkenabled) //item currently being used
2065 {
2066
9/9
✓ Branch 0 taken 1255735 times.
✓ Branch 1 taken 11763531 times.
✓ Branch 2 taken 1255735 times.
✓ Branch 3 taken 1255735 times.
✓ Branch 4 taken 1255735 times.
✓ Branch 5 taken 1255735 times.
✓ Branch 6 taken 1255735 times.
✓ Branch 7 taken 1255735 times.
✓ Branch 8 taken 1255735 times.
21809411 switch(item_type)
2067 {
2068 case itype_clock:
2069 {
2070 1255735 int32_t maxid = getHighestLevelOfFamily(game, itemsbuf, item_type, checkenabled);
2071
2072
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1255735 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1255735 if(maxid != -1 && (itemsbuf[maxid].flags & ITEM_FLAG1)) //Active clock
2073 return itemsbuf[maxid].fam_type;
2074
2075 1255735 return has_item(itype_clock,1) ? 1 : 0;
2076 }
2077
2078 case itype_key:
2079 1255735 return game->get_keys();
2080
2081 case itype_lkey:
2082 1255735 return game->lvlkeys[get_dlevel()];
2083
2084 case itype_magiccontainer:
2085 1255735 return game->get_maxmagic()/game->get_mp_per_block();
2086
2087 case itype_triforcepiece:
2088 {
2089 1255735 int32_t count=0;
2090
2091
2/2
✓ Branch 0 taken 642936320 times.
✓ Branch 1 taken 1255735 times.
644192055 for(int32_t i=0; i<MAXLEVELS; i++)
2092 {
2093 642936320 count+=(game->lvlitems[i]&liTRIFORCE)?1:0;
2094 642936320 }
2095
2096 1255735 return count;
2097 }
2098
2099 case itype_map:
2100 {
2101 1255735 int32_t count=0;
2102
2103
2/2
✓ Branch 0 taken 642936320 times.
✓ Branch 1 taken 1255735 times.
644192055 for(int32_t i=0; i<MAXLEVELS; i++)
2104 {
2105 642936320 count+=(game->lvlitems[i]&liMAP)?1:0;
2106 642936320 }
2107
2108 1255735 return count;
2109 }
2110
2111 case itype_compass:
2112 {
2113 1255735 int32_t count=0;
2114
2115
2/2
✓ Branch 0 taken 642936320 times.
✓ Branch 1 taken 1255735 times.
644192055 for(int32_t i=0; i<MAXLEVELS; i++)
2116 {
2117 642936320 count+=(game->lvlitems[i]&liCOMPASS)?1:0;
2118 642936320 }
2119
2120 1255735 return count;
2121 }
2122
2123 case itype_bosskey:
2124 {
2125 1255735 int32_t count=0;
2126
2127
2/2
✓ Branch 0 taken 642936320 times.
✓ Branch 1 taken 1255735 times.
644192055 for(int32_t i=0; i<MAXLEVELS; i++)
2128 {
2129 642936320 count+=(game->lvlitems[i]&liBOSSKEY)?1:0;
2130 642936320 }
2131
2132 1255735 return count;
2133 }
2134
2135 default:
2136 11763531 int32_t maxid = getHighestLevelOfFamily(game, itemsbuf, item_type, checkenabled);
2137
2138
2/2
✓ Branch 0 taken 2634169 times.
✓ Branch 1 taken 9129362 times.
11763531 if(maxid == -1)
2139 9129362 return 0;
2140
2141 2634169 return itemsbuf[maxid].fam_type;
2142 }
2143 21809411 }
2144
2145 20016936 int32_t current_item(int32_t item_type) //item currently being used
2146 {
2147 20016936 return current_item(item_type, true);
2148 }
2149
2150 13 std::map<int32_t, int32_t> itemcache;
2151
2152 // Not actually used by anything at the moment...
2153 void removeFromItemCache(int32_t itemid)
2154 {
2155 itemcache.erase(itemid);
2156 }
2157
2158 6784 void flushItemCache()
2159 {
2160 6784 itemcache.clear();
2161
2162 //also fix the active subscreen if items were deleted -DD
2163
1/2
✓ Branch 0 taken 6784 times.
✗ Branch 1 not taken.
6784 if(game != NULL)
2164 {
2165 6784 verifyBothWeapons();
2166 6784 load_Sitems(&QMisc);
2167 6784 }
2168 6784 }
2169
2170 // This is used often, so it should be as direct as possible.
2171 708216512 int32_t _c_item_id_internal(int32_t itemtype, bool checkmagic, bool jinx_check)
2172 {
2173
2/2
✓ Branch 0 taken 686192843 times.
✓ Branch 1 taken 22023669 times.
708216512 if(jinx_check)
2174 {
2175
4/4
✓ Branch 0 taken 12674383 times.
✓ Branch 1 taken 9349286 times.
✓ Branch 2 taken 9267357 times.
✓ Branch 3 taken 3407026 times.
22023669 if(!(HeroSwordClk() || HeroItemClk()))
2176 9267357 jinx_check = false; //not jinxed
2177 22023669 }
2178
4/4
✓ Branch 0 taken 703104248 times.
✓ Branch 1 taken 5112264 times.
✓ Branch 2 taken 12660555 times.
✓ Branch 3 taken 690443693 times.
708216512 if(itemtype!=itype_ring && !jinx_check) // Rings must always be checked, as must jinx checks...
2179 {
2180 690443693 std::map<int32_t,int32_t>::iterator res = itemcache.find(itemtype);
2181
2182
2/2
✓ Branch 0 taken 686981661 times.
✓ Branch 1 taken 3462032 times.
690443693 if(res != itemcache.end())
2183 686981661 return res->second;
2184 3462032 }
2185
2186 21234851 int32_t result = -1;
2187 21234851 int32_t highestlevel = -1;
2188
2189
2/2
✓ Branch 0 taken 5436121856 times.
✓ Branch 1 taken 21234851 times.
5457356707 for(int32_t i=0; i<MAXITEMS; i++)
2190 {
2191
5/6
✓ Branch 0 taken 493628120 times.
✓ Branch 1 taken 4942493736 times.
✓ Branch 2 taken 8133783 times.
✓ Branch 3 taken 485494337 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8133783 times.
5436121856 if(game->get_item(i) && itemsbuf[i].family==itemtype && !item_disabled(i))
2192 {
2193
4/4
✓ Branch 0 taken 2085591 times.
✓ Branch 1 taken 6048192 times.
✓ Branch 2 taken 676490 times.
✓ Branch 3 taken 7457293 times.
8133783 if((checkmagic || itemtype == itype_ring) && itemtype != itype_magicring)
2194 {
2195 //printf("Checkmagic for %d: %d (%d %d)\n",i,checkmagiccost(i),itemsbuf[i].magic*game->get_magicdrainrate(),game->get_magic());
2196
2/2
✓ Branch 0 taken 7457291 times.
✓ Branch 1 taken 2 times.
7457293 if(!checkmagiccost(i))
2197 {
2198
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if ( !get_bit(quest_rules,qr_NEVERDISABLEAMMOONSUBSCREEN) ) continue; //don't make items with a magic cost vanish!! -Z
2199 }
2200 7457291 }
2201
6/6
✓ Branch 0 taken 6652239 times.
✓ Branch 1 taken 1481542 times.
✓ Branch 2 taken 133825 times.
✓ Branch 3 taken 1347717 times.
✓ Branch 4 taken 863522 times.
✓ Branch 5 taken 618020 times.
8133781 if(jinx_check && (usesSwordJinx(i) ? HeroSwordClk() : HeroItemClk()))
2202 {
2203
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 618020 times.
618020 if(!(itemsbuf[i].flags & ITEM_JINX_IMMUNE))
2204 618020 continue;
2205 }
2206
2207
2/2
✓ Branch 0 taken 118005 times.
✓ Branch 1 taken 7397756 times.
7515761 if(itemsbuf[i].fam_type >= highestlevel)
2208 {
2209 7397756 highestlevel = itemsbuf[i].fam_type;
2210 7397756 result=i;
2211 7397756 }
2212 7515761 }
2213 5435503834 }
2214
2215
2/2
✓ Branch 0 taken 12756312 times.
✓ Branch 1 taken 8478539 times.
21234851 if(!jinx_check) //Can't cache jinx_check results
2216 8478539 itemcache[itemtype] = result;
2217 21234851 return result;
2218 708216512 }
2219
2220 // 'jinx_check' indicates that the highest level item *immune to jinxes* should be returned.
2221 695631680 int32_t current_item_id(int32_t itemtype, bool checkmagic, bool jinx_check)
2222 {
2223 695631680 auto ret = _c_item_id_internal(itemtype,checkmagic,jinx_check);
2224
2/2
✓ Branch 0 taken 9438837 times.
✓ Branch 1 taken 686192843 times.
695631680 if(!jinx_check) //If not already a jinx-immune-only check...
2225 {
2226 //And the player IS jinxed...
2227
4/4
✓ Branch 0 taken 676965375 times.
✓ Branch 1 taken 9227468 times.
✓ Branch 2 taken 3357364 times.
✓ Branch 3 taken 673608011 times.
686192843 if(HeroSwordClk() || HeroItemClk())
2228 {
2229 //Then do a jinx-immune-only check here
2230 12584832 auto ret2 = _c_item_id_internal(itemtype,checkmagic,true);
2231 //And *IF IT FINDS A VALID ITEM*, return that one instead! -Em
2232 //Should NOT need a compat rule, as this should always return -1 in old quests.
2233
2/2
✓ Branch 0 taken 608791 times.
✓ Branch 1 taken 11976041 times.
12584832 if(ret2 > -1) return ret2;
2234 11976041 }
2235 685584052 }
2236 695022889 return ret;
2237 695631680 }
2238 4291299 int32_t current_item_power(int32_t itemtype)
2239 {
2240 4291299 int32_t result = current_item_id(itemtype,true);
2241
2/2
✓ Branch 0 taken 2424826 times.
✓ Branch 1 taken 1866473 times.
4291299 return (result<0) ? 0 : itemsbuf[result].power;
2242 }
2243
2244 1 int32_t heart_container_id()
2245 {
2246
1/2
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
29 for(int32_t i=0; i<MAXITEMS; i++)
2247 {
2248
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 28 times.
29 if(itemsbuf[i].family == itype_heartcontainer)
2249 {
2250 1 return i;
2251 }
2252 28 }
2253 return -1;
2254 1 }
2255
2256 1255735 int32_t item_tile_mod()
2257 {
2258 1255735 int32_t tile=0;
2259
2260
2/2
✓ Branch 0 taken 36559 times.
✓ Branch 1 taken 1219176 times.
1255735 if(game->get_bombs())
2261 {
2262 1219176 int32_t itemid = current_item_id(itype_bomb,false);
2263
3/4
✓ Branch 0 taken 1138117 times.
✓ Branch 1 taken 81059 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1138117 times.
1219176 if(itemid > -1 && checkbunny(itemid))
2264 1138117 tile+=itemsbuf[itemid].ltm;
2265 1219176 }
2266
2267
2/2
✓ Branch 0 taken 816946 times.
✓ Branch 1 taken 438789 times.
1255735 if(game->get_sbombs())
2268 {
2269 438789 int32_t itemid = current_item_id(itype_sbomb,false);
2270
3/4
✓ Branch 0 taken 437361 times.
✓ Branch 1 taken 1428 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 437361 times.
438789 if(itemid > -1 && checkbunny(itemid))
2271 437361 tile+=itemsbuf[itemid].ltm;
2272 438789 }
2273
2274
2/2
✓ Branch 0 taken 1222180 times.
✓ Branch 1 taken 33555 times.
1255735 if(current_item(itype_clock))
2275 {
2276 33555 int32_t itemid =
2277
1/2
✓ Branch 0 taken 33555 times.
✗ Branch 1 not taken.
33555 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2278 ? iClock
2279 : getHighestLevelEvenUnowned(itemsbuf, itype_clock);
2280
2/4
✓ Branch 0 taken 33555 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 33555 times.
33555 if(itemid > -1 && checkbunny(itemid))
2281 33555 tile+=itemsbuf[itemid].ltm;
2282 33555 }
2283
2284
2/2
✓ Branch 0 taken 715411 times.
✓ Branch 1 taken 540324 times.
1255735 if(current_item(itype_key))
2285 {
2286 540324 int32_t itemid =
2287
1/2
✓ Branch 0 taken 540324 times.
✗ Branch 1 not taken.
540324 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2288 ? iKey
2289 : getHighestLevelEvenUnowned(itemsbuf, itype_key);
2290
2/4
✓ Branch 0 taken 540324 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 540324 times.
540324 if(itemid > -1 && checkbunny(itemid))
2291 540324 tile+=itemsbuf[itemid].ltm;
2292 540324 }
2293
2294
2/2
✓ Branch 0 taken 1254825 times.
✓ Branch 1 taken 910 times.
1255735 if(current_item(itype_lkey))
2295 {
2296 910 int32_t itemid =
2297
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 910 times.
910 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2298 ? iLevelKey
2299 910 : getHighestLevelEvenUnowned(itemsbuf, itype_lkey);
2300
2/4
✓ Branch 0 taken 910 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 910 times.
910 if(itemid > -1 && checkbunny(itemid))
2301 910 tile+=itemsbuf[itemid].ltm;
2302 910 }
2303
2304
2/2
✓ Branch 0 taken 218191 times.
✓ Branch 1 taken 1037544 times.
1255735 if(current_item(itype_map))
2305 {
2306 1037544 int32_t itemid =
2307
2/2
✓ Branch 0 taken 1036758 times.
✓ Branch 1 taken 786 times.
1037544 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2308 ? iMap
2309 786 : getHighestLevelEvenUnowned(itemsbuf, itype_map);
2310
2/4
✓ Branch 0 taken 1037544 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1037544 times.
1037544 if(itemid > -1 && checkbunny(itemid))
2311 1037544 tile+=itemsbuf[itemid].ltm;
2312 1037544 }
2313
2314
2/2
✓ Branch 0 taken 79490 times.
✓ Branch 1 taken 1176245 times.
1255735 if(current_item(itype_compass))
2315 {
2316 1176245 int32_t itemid =
2317
2/2
✓ Branch 0 taken 1095186 times.
✓ Branch 1 taken 81059 times.
1176245 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2318 ? iCompass
2319 81059 : getHighestLevelEvenUnowned(itemsbuf, itype_compass);
2320
2/4
✓ Branch 0 taken 1176245 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1176245 times.
1176245 if(itemid > -1 && checkbunny(itemid))
2321 1176245 tile+=itemsbuf[itemid].ltm;
2322 1176245 }
2323
2324
2/2
✓ Branch 0 taken 571642 times.
✓ Branch 1 taken 684093 times.
1255735 if(current_item(itype_bosskey))
2325 {
2326 684093 int32_t itemid =
2327
1/2
✓ Branch 0 taken 684093 times.
✗ Branch 1 not taken.
684093 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2328 ? iBossKey
2329 : getHighestLevelEvenUnowned(itemsbuf, itype_bosskey);
2330
2/4
✓ Branch 0 taken 684093 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 684093 times.
684093 if(itemid > -1 && checkbunny(itemid))
2331 684093 tile+=itemsbuf[itemid].ltm;
2332 684093 }
2333
2334
2/2
✓ Branch 0 taken 1173890 times.
✓ Branch 1 taken 81845 times.
1255735 if(current_item(itype_magiccontainer))
2335 {
2336 81845 int32_t itemid =
2337
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81845 times.
81845 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2338 ? iMagicC
2339 81845 : getHighestLevelEvenUnowned(itemsbuf, itype_magiccontainer);
2340
2/4
✓ Branch 0 taken 81845 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 81845 times.
81845 if(itemid > -1 && checkbunny(itemid))
2341 81845 tile+=itemsbuf[itemid].ltm;
2342 81845 }
2343
2344
2/2
✓ Branch 0 taken 254396 times.
✓ Branch 1 taken 1001339 times.
1255735 if(current_item(itype_triforcepiece))
2345 {
2346 1001339 int32_t itemid =
2347
1/2
✓ Branch 0 taken 1001339 times.
✗ Branch 1 not taken.
1001339 get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS)
2348 ? iTriforce
2349 : getHighestLevelEvenUnowned(itemsbuf, itype_triforcepiece);
2350
2/4
✓ Branch 0 taken 1001339 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1001339 times.
1001339 if(itemid > -1 && checkbunny(itemid))
2351 1001339 tile+=itemsbuf[itemid].ltm;
2352 1001339 }
2353
2354
2/2
✓ Branch 0 taken 1255735 times.
✓ Branch 1 taken 642936320 times.
644192055 for(int32_t i=0; i<itype_max; i++)
2355 {
2356
2/2
✓ Branch 0 taken 593651200 times.
✓ Branch 1 taken 49285120 times.
642936320 if(!get_bit(quest_rules, qr_HARDCODED_LITEM_LTMS))
2357 {
2358
2/2
✓ Branch 0 taken 962600 times.
✓ Branch 1 taken 48322520 times.
49285120 switch(i)
2359 {
2360 case itype_bomb:
2361 case itype_sbomb:
2362 case itype_clock:
2363 case itype_key:
2364 case itype_lkey:
2365 case itype_map:
2366 case itype_compass:
2367 case itype_bosskey:
2368 case itype_magiccontainer:
2369 case itype_triforcepiece:
2370 962600 continue; //already handled
2371 }
2372 48322520 }
2373 641973720 int32_t itemid = current_item_id(i,false);
2374
2/2
✓ Branch 0 taken 640717985 times.
✓ Branch 1 taken 1255735 times.
641973720 if(i == itype_shield)
2375 1255735 itemid = getCurrentShield(false);
2376
2377
3/4
✓ Branch 0 taken 18774279 times.
✓ Branch 1 taken 623199441 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18774279 times.
641973720 if(itemid < 0 || !checkbunny(itemid))
2378 623199441 continue;
2379
2380 18774279 itemdata const& itm = itemsbuf[itemid];
2381
2382
2/2
✓ Branch 0 taken 17599603 times.
✓ Branch 1 taken 1174676 times.
18774279 switch(itm.family)
2383 {
2384 case itype_shield:
2385
1/2
✓ Branch 0 taken 1174676 times.
✗ Branch 1 not taken.
1174676 if(itm.flags & ITEM_FLAG9) //active shield
2386 {
2387 if(!usingActiveShield(itemid))
2388 {
2389 tile+=itm.misc6; //'Inactive PTM'
2390 continue;
2391 }
2392 }
2393 1174676 break;
2394 }
2395
2396 18774279 tile+=itm.ltm;
2397 18774279 }
2398
2399 1255735 return tile;
2400 }
2401
2402 1255735 int32_t bunny_tile_mod()
2403 {
2404
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1255735 times.
1255735 if(Hero.BunnyClock())
2405 {
2406 return game->get_bunny_ltm();
2407 }
2408 1255735 return 0;
2409 1255735 }
2410
2411 // Hints are drawn on a separate layer to combo reveals.
2412 1248 void draw_lens_under(BITMAP *dest, bool layer)
2413 {
2414 //Lens flag 1: Replacement for qr_LENSHINTS; if set, lens will show hints. Does nothing if flag 2 is set.
2415 //Lens flag 2: Disable "hints", prevent rendering of Secret Combos
2416 //Lens flag 3: Don't show armos/chest/dive items
2417 //Lens flag 4: Show Raft Paths
2418 //Lens flag 5: Show Invisible Enemies
2419
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1248 times.
✓ Branch 2 taken 624 times.
✓ Branch 3 taken 624 times.
1248 bool hints = (itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2) ? false : (layer && (itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG1));
2420
2421 1248 int32_t strike_hint_table[11]=
2422 {
2423 mfARROW, mfBOMB, mfBRANG, mfWANDMAGIC,
2424 mfSWORD, mfREFMAGIC, mfHOOKSHOT,
2425 mfREFFIREBALL, mfHAMMER, mfSWORDBEAM, mfWAND
2426 };
2427
2428 // int32_t page = tmpscr->cpage;
2429 {
2430
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1248 times.
1248 int32_t blink_rate=((get_bit(quest_rules,qr_EPILEPSY) || epilepsyFlashReduction)?6:1);
2431 // int32_t temptimer=0;
2432 1248 int32_t tempitem, tempweapon=0;
2433 1248 strike_hint=strike_hint_table[strike_hint_counter];
2434
2435
2/2
✓ Branch 0 taken 1211 times.
✓ Branch 1 taken 37 times.
1248 if(strike_hint_timer>32)
2436 {
2437 37 strike_hint_timer=0;
2438 37 strike_hint_counter=((strike_hint_counter+1)%11);
2439 37 }
2440
2441 1248 ++strike_hint_timer;
2442
2443
2/2
✓ Branch 0 taken 219648 times.
✓ Branch 1 taken 1248 times.
220896 for(int32_t i=0; i<176; i++)
2444 {
2445 219648 int32_t x = (i & 15) << 4;
2446 219648 int32_t y = (i & 0xF0) + playing_field_offset;
2447 219648 int32_t tempitemx=-16, tempitemy=-16;
2448 219648 int32_t tempweaponx=-16, tempweapony=-16;
2449
2450
2/2
✓ Branch 0 taken 439296 times.
✓ Branch 1 taken 219648 times.
658944 for(int32_t iter=0; iter<2; ++iter)
2451 {
2452 439296 int32_t checkflag=0;
2453
2454
2/2
✓ Branch 0 taken 219648 times.
✓ Branch 1 taken 219648 times.
439296 if(iter==0)
2455 {
2456 219648 checkflag=combobuf[tmpscr->data[i]].flag;
2457 219648 }
2458 else
2459 {
2460 219648 checkflag=tmpscr->sflag[i];
2461 }
2462
2463
1/2
✓ Branch 0 taken 439296 times.
✗ Branch 1 not taken.
439296 if(checkflag==mfSTRIKE)
2464 {
2465 if(!hints)
2466 {
2467 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sSTRIKE],tmpscr->secretcset[sSTRIKE]);
2468 }
2469 else
2470 {
2471 checkflag = strike_hint;
2472 }
2473 }
2474
2475
6/36
✓ Branch 0 taken 422304 times.
✓ Branch 1 taken 168 times.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 528 times.
✓ Branch 5 taken 16176 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 96 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
439296 switch(checkflag)
2476 {
2477 case 0:
2478 case mfZELDA:
2479 case mfPUSHED:
2480 case mfENEMY0:
2481 case mfENEMY1:
2482 case mfENEMY2:
2483 case mfENEMY3:
2484 case mfENEMY4:
2485 case mfENEMY5:
2486 case mfENEMY6:
2487 case mfENEMY7:
2488 case mfENEMY8:
2489 case mfENEMY9:
2490 case mfSINGLE:
2491 case mfSINGLE16:
2492 case mfNOENEMY:
2493 case mfTRAP_H:
2494 case mfTRAP_V:
2495 case mfTRAP_4:
2496 case mfTRAP_LR:
2497 case mfTRAP_UD:
2498 case mfNOGROUNDENEMY:
2499 case mfNOBLOCKS:
2500 case mfSCRIPT1:
2501 case mfSCRIPT2:
2502 case mfSCRIPT3:
2503 case mfSCRIPT4:
2504 case mfSCRIPT5:
2505 case mfSCRIPT6:
2506 case mfSCRIPT7:
2507 case mfSCRIPT8:
2508 case mfSCRIPT9:
2509 case mfSCRIPT10:
2510 case mfSCRIPT11:
2511 case mfSCRIPT12:
2512 case mfSCRIPT13:
2513 case mfSCRIPT14:
2514 case mfSCRIPT15:
2515 case mfSCRIPT16:
2516 case mfSCRIPT17:
2517 case mfSCRIPT18:
2518 case mfSCRIPT19:
2519 case mfSCRIPT20:
2520 case mfPITHOLE:
2521 case mfPITFALLFLOOR:
2522 case mfLAVA:
2523 case mfICE:
2524 case mfICEDAMAGE:
2525 case mfDAMAGE1:
2526 case mfDAMAGE2:
2527 case mfDAMAGE4:
2528 case mfDAMAGE8:
2529 case mfDAMAGE16:
2530 case mfDAMAGE32:
2531 case mfFREEZEALL:
2532 case mfFREZEALLANSFFCS:
2533 case mfFREEZEFFCSOLY:
2534 case mfSCRITPTW1TRIG:
2535 case mfSCRITPTW2TRIG:
2536 case mfSCRITPTW3TRIG:
2537 case mfSCRITPTW4TRIG:
2538 case mfSCRITPTW5TRIG:
2539 case mfSCRITPTW6TRIG:
2540 case mfSCRITPTW7TRIG:
2541 case mfSCRITPTW8TRIG:
2542 case mfSCRITPTW9TRIG:
2543 case mfSCRITPTW10TRIG:
2544 case mfTROWEL:
2545 case mfTROWELNEXT:
2546 case mfTROWELSPECIALITEM:
2547 case mfSLASHPOT:
2548 case mfLIFTPOT:
2549 case mfLIFTORSLASH:
2550 case mfLIFTROCK:
2551 case mfLIFTROCKHEAVY:
2552 case mfDROPITEM:
2553 case mfSPECIALITEM:
2554 case mfDROPKEY:
2555 case mfDROPLKEY:
2556 case mfDROPCOMPASS:
2557 case mfDROPMAP:
2558 case mfDROPBOSSKEY:
2559 case mfSPAWNNPC:
2560 case mfSWITCHHOOK:
2561 case mfSIDEVIEWLADDER:
2562 case mfSIDEVIEWPLATFORM:
2563 case mfNOENEMYSPAWN:
2564 case mfENEMYALL:
2565 case mfNOMIRROR:
2566 case mfUNSAFEGROUND:
2567 case mf168:
2568 case mf169:
2569 case mf170:
2570 case mf171:
2571 case mf172:
2572 case mf173:
2573 case mf174:
2574 case mf175:
2575 case mf176:
2576 case mf177:
2577 case mf178:
2578 case mf179:
2579 case mf180:
2580 case mf181:
2581 case mf182:
2582 case mf183:
2583 case mf184:
2584 case mf185:
2585 case mf186:
2586 case mf187:
2587 case mf188:
2588 case mf189:
2589 case mf190:
2590 case mf191:
2591 case mf192:
2592 case mf193:
2593 case mf194:
2594 case mf195:
2595 case mf196:
2596 case mf197:
2597 case mf198:
2598 case mf199:
2599 case mf200:
2600 case mf201:
2601 case mf202:
2602 case mf203:
2603 case mf204:
2604 case mf205:
2605 case mf206:
2606 case mf207:
2607 case mf208:
2608 case mf209:
2609 case mf210:
2610 case mf211:
2611 case mf212:
2612 case mf213:
2613 case mf214:
2614 case mf215:
2615 case mf216:
2616 case mf217:
2617 case mf218:
2618 case mf219:
2619 case mf220:
2620 case mf221:
2621 case mf222:
2622 case mf223:
2623 case mf224:
2624 case mf225:
2625 case mf226:
2626 case mf227:
2627 case mf228:
2628 case mf229:
2629 case mf230:
2630 case mf231:
2631 case mf232:
2632 case mf233:
2633 case mf234:
2634 case mf235:
2635 case mf236:
2636 case mf237:
2637 case mf238:
2638 case mf239:
2639 case mf240:
2640 case mf241:
2641 case mf242:
2642 case mf243:
2643 case mf244:
2644 case mf245:
2645 case mf246:
2646 case mf247:
2647 case mf248:
2648 case mf249:
2649 case mf250:
2650 case mf251:
2651 case mf252:
2652 case mf253:
2653 case mf254:
2654 case mfEXTENDED:
2655 422304 break;
2656
2657 case mfPUSHUD:
2658 case mfPUSHLR:
2659 case mfPUSH4:
2660 case mfPUSHU:
2661 case mfPUSHD:
2662 case mfPUSHL:
2663 case mfPUSHR:
2664 case mfPUSHUDNS:
2665 case mfPUSHLRNS:
2666 case mfPUSH4NS:
2667 case mfPUSHUNS:
2668 case mfPUSHDNS:
2669 case mfPUSHLNS:
2670 case mfPUSHRNS:
2671 case mfPUSHUDINS:
2672 case mfPUSHLRINS:
2673 case mfPUSH4INS:
2674 case mfPUSHUINS:
2675 case mfPUSHDINS:
2676 case mfPUSHLINS:
2677 case mfPUSHRINS:
2678
3/4
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 84 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 84 times.
168 if(!hints && ((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&16))
2679
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 84 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 84 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
84 || ((get_debug() && zc_getkey(KEY_N)) && (frame&16))))
2680 {
2681 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->undercombo,tmpscr->undercset);
2682 }
2683
2684
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
168 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2685
3/6
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 84 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 84 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
168 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2686 {
2687
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 42 times.
84 if(hints)
2688 {
2689
1/3
✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
42 switch(combobuf[tmpscr->data[i]].type)
2690 {
2691 case cPUSH_HEAVY:
2692 case cPUSH_HW:
2693 tempitem=getItemIDPower(itemsbuf,itype_bracelet,1);
2694 tempitemx=x, tempitemy=y;
2695
2696 if(tempitem>-1)
2697 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2698
2699 break;
2700
2701 case cPUSH_HEAVY2:
2702 case cPUSH_HW2:
2703 42 tempitem=getItemIDPower(itemsbuf,itype_bracelet,2);
2704 42 tempitemx=x, tempitemy=y;
2705
2706
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
42 if(tempitem>-1)
2707 42 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2708
2709 42 break;
2710 }
2711 42 }
2712 84 }
2713
2714 168 break;
2715
2716 case mfWHISTLE:
2717 if(hints)
2718 {
2719 tempitem=getItemID(itemsbuf,itype_whistle,1);
2720
2721 if(tempitem<0) break;
2722
2723 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2724 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2725 {
2726 tempitemx=x;
2727 tempitemy=y;
2728 }
2729
2730 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2731 }
2732
2733 break;
2734
2735 //Why is this here?
2736 case mfFAIRY:
2737 case mfMAGICFAIRY:
2738 case mfALLFAIRY:
2739 if(hints)
2740 {
2741 tempitem=getItemID(itemsbuf, itype_fairy,1);//iFairyMoving;
2742
2743 if(tempitem < 0) break;
2744
2745 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2746 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2747 {
2748 tempitemx=x;
2749 tempitemy=y;
2750 }
2751
2752 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2753 }
2754
2755 break;
2756
2757 case mfBCANDLE:
2758 if(!hints)
2759 {
2760 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sBCANDLE],tmpscr->secretcset[sBCANDLE]);
2761 }
2762 else
2763 {
2764 tempitem=getItemID(itemsbuf,itype_candle,1);
2765
2766 if(tempitem<0) break;
2767
2768 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2769 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2770 {
2771 tempitemx=x;
2772 tempitemy=y;
2773 }
2774
2775 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2776 }
2777
2778 break;
2779
2780 case mfRCANDLE:
2781 if(!hints)
2782 {
2783 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sRCANDLE],tmpscr->secretcset[sRCANDLE]);
2784 }
2785 else
2786 {
2787 tempitem=getItemID(itemsbuf,itype_candle,2);
2788
2789 if(tempitem<0) break;
2790
2791 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2792 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2793 {
2794 tempitemx=x;
2795 tempitemy=y;
2796 }
2797
2798 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2799 }
2800
2801 break;
2802
2803 case mfWANDFIRE:
2804 if(!hints)
2805 {
2806 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sWANDFIRE],tmpscr->secretcset[sWANDFIRE]);
2807 }
2808 else
2809 {
2810 tempitem=getItemID(itemsbuf,itype_wand,1);
2811
2812 if(tempitem<0) break;
2813
2814 tempweapon=wFire;
2815
2816 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2817 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2818 {
2819 tempitemx=x;
2820 tempitemy=y;
2821 }
2822 else
2823 {
2824 tempweaponx=x;
2825 tempweapony=y;
2826 }
2827
2828 putweapon(dest,tempweaponx,tempweapony,tempweapon, 0, up, lens_hint_weapon[tempweapon][0], lens_hint_weapon[tempweapon][1],-1);
2829 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2830 }
2831
2832 break;
2833
2834 case mfDINSFIRE:
2835 if(!hints)
2836 {
2837 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sDINSFIRE],tmpscr->secretcset[sDINSFIRE]);
2838 }
2839 else
2840 {
2841 tempitem=getItemID(itemsbuf,itype_dinsfire,1);
2842
2843 if(tempitem<0) break;
2844
2845 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2846 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2847 {
2848 tempitemx=x;
2849 tempitemy=y;
2850 }
2851
2852 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2853 }
2854
2855 break;
2856
2857 case mfARROW:
2858 if(!hints)
2859 {
2860 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sARROW],tmpscr->secretcset[sARROW]);
2861 }
2862 else
2863 {
2864 tempitem=getItemID(itemsbuf,itype_arrow,1);
2865
2866 if(tempitem<0) break;
2867
2868 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2869 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2870 {
2871 tempitemx=x;
2872 tempitemy=y;
2873 }
2874
2875 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2876 }
2877
2878 break;
2879
2880 case mfSARROW:
2881 if(!hints)
2882 {
2883 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sSARROW],tmpscr->secretcset[sSARROW]);
2884 }
2885 else
2886 {
2887 tempitem=getItemID(itemsbuf,itype_arrow,2);
2888
2889 if(tempitem<0) break;
2890
2891 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2892 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2893 {
2894 tempitemx=x;
2895 tempitemy=y;
2896 }
2897
2898 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2899 }
2900
2901 break;
2902
2903 case mfGARROW:
2904 if(!hints)
2905 {
2906 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sGARROW],tmpscr->secretcset[sGARROW]);
2907 }
2908 else
2909 {
2910 tempitem=getItemID(itemsbuf,itype_arrow,3);
2911
2912 if(tempitem<0) break;
2913
2914 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2915 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2916 {
2917 tempitemx=x;
2918 tempitemy=y;
2919 }
2920
2921 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2922 }
2923
2924 break;
2925
2926 case mfBOMB:
2927 if(!hints)
2928 {
2929 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sBOMB],tmpscr->secretcset[sBOMB]);
2930 }
2931 else
2932 {
2933 //tempitem=getItemID(itemsbuf,itype_bomb,1);
2934 tempweapon = wLitBomb;
2935
2936 //if (tempitem<0) break;
2937 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2938 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2939 {
2940 tempweaponx=x;
2941 tempweapony=y;
2942 }
2943
2944 putweapon(dest,tempweaponx,tempweapony+lens_hint_weapon[tempweapon][4],tempweapon, 0, up, lens_hint_weapon[tempweapon][0], lens_hint_weapon[tempweapon][1],-1);
2945 }
2946
2947 break;
2948
2949 case mfSBOMB:
2950
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 48 times.
96 if(!hints)
2951 {
2952
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sSBOMB],tmpscr->secretcset[sSBOMB]);
2953 48 }
2954 else
2955 {
2956 //tempitem=getItemID(itemsbuf,itype_sbomb,1);
2957 //if (tempitem<0) break;
2958 48 tempweapon = wLitSBomb;
2959
2960
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2961
3/6
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
48 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2962 {
2963 24 tempweaponx=x;
2964 24 tempweapony=y;
2965 24 }
2966
2967 48 putweapon(dest,tempweaponx,tempweapony+lens_hint_weapon[tempweapon][4],tempweapon, 0, up, lens_hint_weapon[tempweapon][0], lens_hint_weapon[tempweapon][1],-1);
2968 }
2969
2970 96 break;
2971
2972 case mfARMOS_SECRET:
2973 if(!hints)
2974 {
2975 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sSTAIRS],tmpscr->secretcset[sSTAIRS]);
2976 }
2977 break;
2978
2979 case mfBRANG:
2980 if(!hints)
2981 {
2982 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sBRANG],tmpscr->secretcset[sBRANG]);
2983 }
2984 else
2985 {
2986 tempitem=getItemID(itemsbuf,itype_brang,1);
2987
2988 if(tempitem<0) break;
2989
2990 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
2991 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
2992 {
2993 tempitemx=x;
2994 tempitemy=y;
2995 }
2996
2997 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
2998 }
2999
3000 break;
3001
3002 case mfMBRANG:
3003 if(!hints)
3004 {
3005 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sMBRANG],tmpscr->secretcset[sMBRANG]);
3006 }
3007 else
3008 {
3009 tempitem=getItemID(itemsbuf,itype_brang,2);
3010
3011 if(tempitem<0) break;
3012
3013 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3014 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3015 {
3016 tempitemx=x;
3017 tempitemy=y;
3018 }
3019
3020 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3021 }
3022
3023 break;
3024
3025 case mfFBRANG:
3026 if(!hints)
3027 {
3028 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sFBRANG],tmpscr->secretcset[sFBRANG]);
3029 }
3030 else
3031 {
3032 tempitem=getItemID(itemsbuf,itype_brang,3);
3033
3034 if(tempitem<0) break;
3035
3036 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3037 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3038 {
3039 tempitemx=x;
3040 tempitemy=y;
3041 }
3042
3043 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3044 }
3045
3046 break;
3047
3048 case mfWANDMAGIC:
3049 if(!hints)
3050 {
3051 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sWANDMAGIC],tmpscr->secretcset[sWANDMAGIC]);
3052 }
3053 else
3054 {
3055 tempitem=getItemID(itemsbuf,itype_wand,1);
3056
3057 if(tempitem<0) break;
3058
3059 tempweapon=itemsbuf[tempitem].wpn3;
3060
3061 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3062 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3063 {
3064 tempitemx=x;
3065 tempitemy=y;
3066 }
3067 else
3068 {
3069 tempweaponx=x;
3070 tempweapony=y;
3071 --lens_hint_weapon[wMagic][4];
3072
3073 if(lens_hint_weapon[wMagic][4]<-8)
3074 {
3075 lens_hint_weapon[wMagic][4]=8;
3076 }
3077 }
3078
3079 putweapon(dest,tempweaponx,tempweapony+lens_hint_weapon[tempweapon][4],tempweapon, 0, up, lens_hint_weapon[tempweapon][0], lens_hint_weapon[tempweapon][1],-1);
3080 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3081 }
3082
3083 break;
3084
3085 case mfREFMAGIC:
3086 if(!hints)
3087 {
3088 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sREFMAGIC],tmpscr->secretcset[sREFMAGIC]);
3089 }
3090 else
3091 {
3092 tempitem=getItemID(itemsbuf,itype_shield,3);
3093
3094 if(tempitem<0) break;
3095
3096 tempweapon=ewMagic;
3097
3098 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3099 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3100 {
3101 tempitemx=x;
3102 tempitemy=y;
3103 }
3104 else
3105 {
3106 tempweaponx=x;
3107 tempweapony=y;
3108
3109 if(lens_hint_weapon[ewMagic][2]==up)
3110 {
3111 --lens_hint_weapon[ewMagic][4];
3112 }
3113 else
3114 {
3115 ++lens_hint_weapon[ewMagic][4];
3116 }
3117
3118 if(lens_hint_weapon[ewMagic][4]>8)
3119 {
3120 lens_hint_weapon[ewMagic][2]=up;
3121 }
3122
3123 if(lens_hint_weapon[ewMagic][4]<=0)
3124 {
3125 lens_hint_weapon[ewMagic][2]=down;
3126 }
3127 }
3128
3129 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3130 putweapon(dest,tempweaponx,tempweapony+lens_hint_weapon[tempweapon][4],tempweapon, 0, lens_hint_weapon[ewMagic][2], lens_hint_weapon[tempweapon][0], lens_hint_weapon[tempweapon][1],-1);
3131 }
3132
3133 break;
3134
3135 case mfREFFIREBALL:
3136 if(!hints)
3137 {
3138 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sREFFIREBALL],tmpscr->secretcset[sREFFIREBALL]);
3139 }
3140 else
3141 {
3142 tempitem=getItemID(itemsbuf,itype_shield,3);
3143
3144 if(tempitem<0) break;
3145
3146 tempweapon=ewFireball;
3147
3148 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3149 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3150 {
3151 tempitemx=x;
3152 tempitemy=y;
3153 tempweaponx=x;
3154 tempweapony=y;
3155 ++lens_hint_weapon[ewFireball][3];
3156
3157 if(lens_hint_weapon[ewFireball][3]>8)
3158 {
3159 lens_hint_weapon[ewFireball][3]=-8;
3160 lens_hint_weapon[ewFireball][4]=8;
3161 }
3162
3163 if(lens_hint_weapon[ewFireball][3]>0)
3164 {
3165 ++lens_hint_weapon[ewFireball][4];
3166 }
3167 else
3168 {
3169 --lens_hint_weapon[ewFireball][4];
3170 }
3171 }
3172
3173 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3174 putweapon(dest,tempweaponx+lens_hint_weapon[tempweapon][3],tempweapony+lens_hint_weapon[ewFireball][4],tempweapon, 0, up, lens_hint_weapon[tempweapon][0], lens_hint_weapon[tempweapon][1],-1);
3175 }
3176
3177 break;
3178
3179 case mfSWORD:
3180 if(!hints)
3181 {
3182 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sSWORD],tmpscr->secretcset[sSWORD]);
3183 }
3184 else
3185 {
3186 tempitem=getItemID(itemsbuf,itype_sword,1);
3187
3188 if(tempitem<0) break;
3189
3190 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3191 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3192 {
3193 tempitemx=x;
3194 tempitemy=y;
3195 }
3196
3197 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3198 }
3199
3200 break;
3201
3202 case mfWSWORD:
3203 if(!hints)
3204 {
3205 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sWSWORD],tmpscr->secretcset[sWSWORD]);
3206 }
3207 else
3208 {
3209 tempitem=getItemID(itemsbuf,itype_sword,2);
3210
3211 if(tempitem<0) break;
3212
3213 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3214 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3215 {
3216 tempitemx=x;
3217 tempitemy=y;
3218 }
3219
3220 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3221 }
3222
3223 break;
3224
3225 case mfMSWORD:
3226 if(!hints)
3227 {
3228 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sMSWORD],tmpscr->secretcset[sMSWORD]);
3229 }
3230 else
3231 {
3232 tempitem=getItemID(itemsbuf,itype_sword,3);
3233
3234 if(tempitem<0) break;
3235
3236 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3237 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3238 {
3239 tempitemx=x;
3240 tempitemy=y;
3241 }
3242
3243 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3244 }
3245
3246 break;
3247
3248 case mfXSWORD:
3249 if(!hints)
3250 {
3251 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sXSWORD],tmpscr->secretcset[sXSWORD]);
3252 }
3253 else
3254 {
3255 tempitem=getItemID(itemsbuf,itype_sword,4);
3256
3257 if(tempitem<0) break;
3258
3259 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3260 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3261 {
3262 tempitemx=x;
3263 tempitemy=y;
3264 }
3265
3266 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3267 }
3268
3269 break;
3270
3271 case mfSWORDBEAM:
3272 if(!hints)
3273 {
3274 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sSWORDBEAM],tmpscr->secretcset[sSWORDBEAM]);
3275 }
3276 else
3277 {
3278 tempitem=getItemID(itemsbuf,itype_sword,1);
3279
3280 if(tempitem<0) break;
3281
3282 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3283 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3284 {
3285 tempitemx=x;
3286 tempitemy=y;
3287 }
3288
3289 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 1);
3290 }
3291
3292 break;
3293
3294 case mfWSWORDBEAM:
3295 if(!hints)
3296 {
3297 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sWSWORDBEAM],tmpscr->secretcset[sWSWORDBEAM]);
3298 }
3299 else
3300 {
3301 tempitem=getItemID(itemsbuf,itype_sword,2);
3302
3303 if(tempitem<0) break;
3304
3305 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3306 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3307 {
3308 tempitemx=x;
3309 tempitemy=y;
3310 }
3311
3312 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 2);
3313 }
3314
3315 break;
3316
3317 case mfMSWORDBEAM:
3318 if(!hints)
3319 {
3320 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sMSWORDBEAM],tmpscr->secretcset[sMSWORDBEAM]);
3321 }
3322 else
3323 {
3324 tempitem=getItemID(itemsbuf,itype_sword,3);
3325
3326 if(tempitem<0) break;
3327
3328 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3329 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3330 {
3331 tempitemx=x;
3332 tempitemy=y;
3333 }
3334
3335 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 3);
3336 }
3337
3338 break;
3339
3340 case mfXSWORDBEAM:
3341 if(!hints)
3342 {
3343 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sXSWORDBEAM],tmpscr->secretcset[sXSWORDBEAM]);
3344 }
3345 else
3346 {
3347 tempitem=getItemID(itemsbuf,itype_sword,4);
3348
3349 if(tempitem<0) break;
3350
3351 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3352 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3353 {
3354 tempitemx=x;
3355 tempitemy=y;
3356 }
3357
3358 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 4);
3359 }
3360
3361 break;
3362
3363 case mfHOOKSHOT:
3364 if(!hints)
3365 {
3366 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sHOOKSHOT],tmpscr->secretcset[sHOOKSHOT]);
3367 }
3368 else
3369 {
3370 tempitem=getItemID(itemsbuf,itype_hookshot,1);
3371
3372 if(tempitem<0) break;
3373
3374 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3375 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3376 {
3377 tempitemx=x;
3378 tempitemy=y;
3379 }
3380
3381 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3382 }
3383
3384 break;
3385
3386 case mfWAND:
3387 if(!hints)
3388 {
3389 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sWAND],tmpscr->secretcset[sWAND]);
3390 }
3391 else
3392 {
3393 tempitem=getItemID(itemsbuf,itype_wand,1);
3394
3395 if(tempitem<0) break;
3396
3397 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3398 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3399 {
3400 tempitemx=x;
3401 tempitemy=y;
3402 }
3403
3404 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3405 }
3406
3407 break;
3408
3409 case mfHAMMER:
3410 if(!hints)
3411 {
3412 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))putcombo(dest,x,y,tmpscr->secretcombo[sHAMMER],tmpscr->secretcset[sHAMMER]);
3413 }
3414 else
3415 {
3416 tempitem=getItemID(itemsbuf,itype_hammer,1);
3417
3418 if(tempitem<0) break;
3419
3420 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate))
3421 || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3422 {
3423 tempitemx=x;
3424 tempitemy=y;
3425 }
3426
3427 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3428 }
3429
3430 break;
3431
3432 case mfARMOS_ITEM:
3433 case mfDIVE_ITEM:
3434
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 528 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 528 times.
528 if((!getmapflag() || (tmpscr->flags9&fBELOWRETURN)) && !(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG3))
3435 {
3436 528 putitem2(dest,x,y,tmpscr->catchall, lens_hint_item[tmpscr->catchall][0], lens_hint_item[tmpscr->catchall][1], 0);
3437 528 }
3438 528 break;
3439
3440 case 16:
3441 case 17:
3442 case 18:
3443 case 19:
3444 case 20:
3445 case 21:
3446 case 22:
3447 case 23:
3448 case 24:
3449 case 25:
3450 case 26:
3451 case 27:
3452 case 28:
3453 case 29:
3454 case 30:
3455 case 31:
3456
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if(!hints)
3457
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
24 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))
3458 12 putcombo(dest,x,y,tmpscr->secretcombo[checkflag-16+4],tmpscr->secretcset[checkflag-16+4]);
3459
3460 24 break;
3461 case mfSECRETSNEXT:
3462 if(!hints)
3463 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))
3464 putcombo(dest,x,y,tmpscr->data[i]+1,tmpscr->cset[i]);
3465
3466 break;
3467
3468 case mfSTRIKE:
3469 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))
3470 {
3471 goto special;
3472 }
3473 else
3474 {
3475 break;
3476 }
3477
3478 16176 default: goto special;
3479
3480 special:
3481
7/8
✓ Branch 0 taken 8088 times.
✓ Branch 1 taken 8088 times.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 7980 times.
✓ Branch 4 taken 84 times.
✓ Branch 5 taken 24 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8004 times.
16176 if(layer && ((checkflag!=mfRAFT && checkflag!=mfRAFT_BRANCH&& checkflag!=mfRAFT_BOUNCE) ||(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG4)))
3482 {
3483
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 84 times.
✓ Branch 2 taken 42 times.
✓ Branch 3 taken 42 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 42 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
84 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&blink_rate)) || ((get_debug() && zc_getkey(KEY_N)) && (frame&blink_rate)))
3484 {
3485 42 rectfill(dest,x,y,x+15,y+15,WHITE);
3486 42 }
3487 84 }
3488
3489 16176 break;
3490 }
3491 439296 }
3492 219648 }
3493
3494
2/2
✓ Branch 0 taken 624 times.
✓ Branch 1 taken 624 times.
1248 if(layer)
3495 {
3496
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[0]==dWALK)
3497 rectfill(dest, 120, 16+playing_field_offset, 135, 31+playing_field_offset, WHITE);
3498
3499
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[1]==dWALK)
3500 rectfill(dest, 120, 144+playing_field_offset, 135, 159+playing_field_offset, WHITE);
3501
3502
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[2]==dWALK)
3503 rectfill(dest, 16, 80+playing_field_offset, 31, 95+playing_field_offset, WHITE);
3504
3505
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[3]==dWALK)
3506 rectfill(dest, 224, 80+playing_field_offset, 239, 95+playing_field_offset, WHITE);
3507
3508
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[0]==dBOMB)
3509 {
3510 showbombeddoor(dest, 0);
3511 }
3512
3513
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[1]==dBOMB)
3514 {
3515 showbombeddoor(dest, 1);
3516 }
3517
3518
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[2]==dBOMB)
3519 {
3520 showbombeddoor(dest, 2);
3521 }
3522
3523
1/2
✓ Branch 0 taken 624 times.
✗ Branch 1 not taken.
624 if(tmpscr->door[3]==dBOMB)
3524 {
3525 showbombeddoor(dest, 3);
3526 }
3527 624 }
3528
3529
2/2
✓ Branch 0 taken 1200 times.
✓ Branch 1 taken 48 times.
1248 if(tmpscr->stairx + tmpscr->stairy)
3530 {
3531
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
48 if(!hints)
3532 {
3533
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if(!(itemsbuf[Hero.getLastLensID()].flags & ITEM_FLAG2))
3534 24 putcombo(dest,tmpscr->stairx,tmpscr->stairy+playing_field_offset,tmpscr->secretcombo[sSTAIRS],tmpscr->secretcset[sSTAIRS]);
3535 24 }
3536 else
3537 {
3538
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if(tmpscr->flags&fWHISTLE)
3539 {
3540 tempitem=getItemID(itemsbuf,itype_whistle,1);
3541 int32_t tempitemx=-16;
3542 int32_t tempitemy=-16;
3543
3544 if((!(get_debug() && zc_getkey(KEY_N)) && (lensclk&(blink_rate/4)))
3545 || ((get_debug() && zc_getkey(KEY_N)) && (frame&(blink_rate/4))))
3546 {
3547 tempitemx=tmpscr->stairx;
3548 tempitemy=tmpscr->stairy+playing_field_offset;
3549 }
3550
3551 putitem2(dest,tempitemx,tempitemy,tempitem, lens_hint_item[tempitem][0], lens_hint_item[tempitem][1], 0);
3552 }
3553 }
3554 48 }
3555 }
3556 1248 }
3557
3558 BITMAP *lens_scr_d; // The "d" is for "destructible"!
3559
3560 624 void draw_lens_over()
3561 {
3562 // Oh, what the heck.
3563 static BITMAP *lens_scr = NULL;
3564 static int32_t last_width = -1;
3565 624 int32_t width = itemsbuf[current_item_id(itype_lens,true)].misc1;
3566
3567 // Only redraw the circle if the size has changed
3568
2/2
✓ Branch 0 taken 623 times.
✓ Branch 1 taken 1 times.
624 if(width != last_width)
3569 {
3570
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(lens_scr == NULL)
3571 {
3572 1 lens_scr = create_bitmap_ex(8,2*288,2*(240-playing_field_offset));
3573 1 }
3574
3575 1 clear_to_color(lens_scr, BLACK);
3576 1 circlefill(lens_scr, 288, 240-playing_field_offset, width, 0);
3577 1 circle(lens_scr, 288, 240-playing_field_offset, width+2, 0);
3578 1 circle(lens_scr, 288, 240-playing_field_offset, width+5, 0);
3579 1 last_width=width;
3580 1 }
3581
3582 624 masked_blit(lens_scr, framebuf, 288-(HeroX()+8), 240-playing_field_offset-(HeroY()+8), 0, playing_field_offset, 256, 168);
3583 624 }
3584
3585 //----------------------------------------------------------------
3586
3587 7245 void draw_wavy(BITMAP *source, BITMAP *target, int32_t amplitude, bool interpol)
3588 {
3589 //recreating a big bitmap every frame is highly sluggish.
3590
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7244 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
7245 static BITMAP *wavebuf = create_bitmap_ex(8,288,240-original_playing_field_offset);
3591 7245 clear_to_color(wavebuf, BLACK);
3592 7245 blit(source,wavebuf,0,original_playing_field_offset,16,0,256,224-original_playing_field_offset);
3593
3594 int32_t ofs;
3595 // int32_t amplitude=8;
3596 // int32_t wavelength=4;
3597
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7245 times.
7245 amplitude = zc_min(2048,amplitude); // some arbitrary limit to prevent crashing
3598
2/6
✓ Branch 0 taken 7245 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7245 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7245 if((epilepsyFlashReduction || get_bit(quest_rules,qr_EPILEPSY)) && !get_bit(quest_rules, qr_WAVY_NO_EPILEPSY)) amplitude = zc_min(16,amplitude);
3599 7245 int32_t amp2=168;
3600
2/4
✓ Branch 0 taken 7245 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7245 times.
✗ Branch 3 not taken.
7245 if((epilepsyFlashReduction || get_bit(quest_rules,qr_EPILEPSY)) && !get_bit(quest_rules, qr_WAVY_NO_EPILEPSY_2)) amp2*=2;
3601 7245 int32_t i=frame%amp2;
3602
3603
2/2
✓ Branch 0 taken 1217160 times.
✓ Branch 1 taken 7245 times.
1224405 for(int32_t j=0; j<168; j++)
3604 {
3605
3/4
✓ Branch 0 taken 608580 times.
✓ Branch 1 taken 608580 times.
✓ Branch 2 taken 608580 times.
✗ Branch 3 not taken.
1217160 if(j&1 && interpol)
3606 {
3607 // Add 288*2048 to ensure it's never negative. It'll get modded out.
3608 ofs=288*2048+int32_t(zc::math::Sin((double(i+j)*2*PI/amp2))*amplitude);
3609 }
3610 else
3611 {
3612 1217160 ofs=288*2048-int32_t(zc::math::Sin((double(i+j)*2*PI/amp2))*amplitude);
3613 }
3614
3615
1/2
✓ Branch 0 taken 1217160 times.
✗ Branch 1 not taken.
1217160 if(ofs)
3616 {
3617
2/2
✓ Branch 0 taken 311592960 times.
✓ Branch 1 taken 1217160 times.
312810120 for(int32_t k=0; k<256; k++)
3618 {
3619 311592960 target->line[j+original_playing_field_offset][k]=wavebuf->line[j][(k+ofs+16)%288];
3620 311592960 }
3621 1217160 }
3622 1217160 }
3623 7245 }
3624
3625 384 void draw_fuzzy(int32_t fuzz)
3626 // draws from right half of scrollbuf to framebuf
3627 {
3628 int32_t firstx, firsty, xstep, ystep, i, y, dx, dy;
3629 byte *start, *si, *di;
3630
3631
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 384 times.
384 if(fuzz<1)
3632 fuzz = 1;
3633
3634 384 xstep = 128%fuzz;
3635
3636
2/2
✓ Branch 0 taken 80 times.
✓ Branch 1 taken 304 times.
384 if(xstep > 0)
3637 304 xstep = fuzz-xstep;
3638
3639 384 ystep = 112%fuzz;
3640
3641
2/2
✓ Branch 0 taken 112 times.
✓ Branch 1 taken 272 times.
384 if(ystep > 0)
3642 272 ystep = fuzz-ystep;
3643
3644 384 firsty = 1;
3645
3646
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 13856 times.
14240 for(y=0; y<224;)
3647 {
3648 13856 start = &(scrollbuf->line[y][256]);
3649
3650
4/4
✓ Branch 0 taken 13664 times.
✓ Branch 1 taken 86208 times.
✓ Branch 2 taken 86016 times.
✓ Branch 3 taken 13856 times.
99872 for(dy=0; dy<ystep && dy+y<224; dy++)
3651 {
3652 86016 si = start;
3653 86016 di = &(framebuf->line[y+dy][0]);
3654 86016 i = xstep;
3655 86016 firstx = 1;
3656
3657
2/2
✓ Branch 0 taken 22020096 times.
✓ Branch 1 taken 86016 times.
22106112 for(dx=0; dx<256; dx++)
3658 {
3659 22020096 *(di++) = *si;
3660
3661
2/2
✓ Branch 0 taken 18554368 times.
✓ Branch 1 taken 3465728 times.
22020096 if(++i >= fuzz)
3662 {
3663
2/2
✓ Branch 0 taken 3379712 times.
✓ Branch 1 taken 86016 times.
3465728 if(!firstx)
3664 3379712 si += fuzz;
3665 else
3666 {
3667 86016 si += fuzz-xstep;
3668 86016 firstx = 0;
3669 }
3670
3671 3465728 i = 0;
3672 3465728 }
3673 22020096 }
3674 86016 }
3675
3676
2/2
✓ Branch 0 taken 13472 times.
✓ Branch 1 taken 384 times.
13856 if(!firsty)
3677 13472 y += fuzz;
3678 else
3679 {
3680 384 y += ystep;
3681 384 ystep = fuzz;
3682 384 firsty = 0;
3683 }
3684 }
3685 384 }
3686
3687 2165885 void updatescr(bool allowwavy)
3688 {
3689
4/6
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 2165872 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 13 times.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
2165885 static BITMAP *wavybuf = create_bitmap_ex(8,256,224);
3690
4/6
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 2165872 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
2165885 static BITMAP *panorama = create_bitmap_ex(8,256,224);
3691
3692
1/2
✓ Branch 0 taken 2165885 times.
✗ Branch 1 not taken.
2165885 if(toogam)
3693 {
3694 textout_ex(framebuf,font,"no walls",8,216,1,-1);
3695 }
3696
3697
1/2
✓ Branch 0 taken 2165885 times.
✗ Branch 1 not taken.
2165885 if(Showpal)
3698 dump_pal(framebuf);
3699
3700
2/2
✓ Branch 0 taken 2147585 times.
✓ Branch 1 taken 18300 times.
2165885 if(!Playing)
3701 18300 black_opening_count=0;
3702
3703
2/2
✓ Branch 0 taken 2155061 times.
✓ Branch 1 taken 10824 times.
2165885 if(black_opening_count<0) //shape is opening up
3704 {
3705 10824 black_opening(framebuf,black_opening_x,black_opening_y,(66+black_opening_count),66);
3706
3707
2/4
✓ Branch 0 taken 10824 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10824 times.
10824 if(Advance||(!Paused))
3708 {
3709 10824 ++black_opening_count;
3710 10824 }
3711 10824 }
3712
2/2
✓ Branch 0 taken 2151365 times.
✓ Branch 1 taken 3696 times.
2155061 else if(black_opening_count>0) //shape is closing
3713 {
3714 3696 black_opening(framebuf,black_opening_x,black_opening_y,black_opening_count,66);
3715
3716
2/4
✓ Branch 0 taken 3696 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3696 times.
3696 if(Advance||(!Paused))
3717 {
3718 3696 --black_opening_count;
3719 3696 }
3720 3696 }
3721
3722
3/4
✓ Branch 0 taken 2151585 times.
✓ Branch 1 taken 14300 times.
✓ Branch 2 taken 2151585 times.
✗ Branch 3 not taken.
2165885 if(black_opening_count==0&&black_opening_shape==bosFADEBLACK)
3723 {
3724 black_opening_shape = bosCIRCLE;
3725 memcpy(RAMpal, tempblackpal, PAL_SIZE*sizeof(RGB));
3726 refreshTints();
3727 refreshpal=true;
3728 }
3729
3730
2/2
✓ Branch 0 taken 2068802 times.
✓ Branch 1 taken 97083 times.
2165885 if(refreshpal)
3731 {
3732 97083 refreshpal=false;
3733 97083 RAMpal[253] = _RGB(0,0,0);
3734 97083 RAMpal[254] = _RGB(63,63,63);
3735 97083 hw_palette = &RAMpal;
3736 97083 update_hw_pal = true;
3737
3738 97083 create_rgb_table(&rgb_table, RAMpal, NULL);
3739 97083 create_zc_trans_table(&trans_table, RAMpal, 128, 128, 128);
3740 97083 memcpy(&trans_table2, &trans_table, sizeof(COLOR_MAP));
3741
3742
2/2
✓ Branch 0 taken 24853248 times.
✓ Branch 1 taken 97083 times.
24950331 for(int32_t q=0; q<PAL_SIZE; q++)
3743 {
3744 24853248 trans_table2.data[0][q] = q;
3745 24853248 trans_table2.data[q][q] = q;
3746 24853248 }
3747 97083 }
3748
3749 2165885 bool clearwavy = (wavy <= 0);
3750
3751
2/2
✓ Branch 0 taken 7245 times.
✓ Branch 1 taken 2158640 times.
2165885 if(wavy <= 0)
3752 {
3753 // So far one thing can alter wavy apart from scripts: Wavy DMaps.
3754 2158640 wavy = (DMaps[currdmap].flags&dmfWAVY ? 4 : 0);
3755 2158640 }
3756
3757 2165885 blit(framebuf, wavybuf, 0, 0, 0, 0, 256, 224);
3758
3759
4/6
✓ Branch 0 taken 7245 times.
✓ Branch 1 taken 2158640 times.
✓ Branch 2 taken 7245 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 7245 times.
2165885 if(wavy && Playing && allowwavy)
3760 {
3761 7245 draw_wavy(framebuf, wavybuf, wavy,false);
3762 7245 }
3763
3764
2/2
✓ Branch 0 taken 2158640 times.
✓ Branch 1 taken 7245 times.
2165885 if(clearwavy)
3765 2158640 wavy = 0; // Wavy was set by a DMap flag. Clear it.
3766
2/4
✓ Branch 0 taken 7245 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7245 times.
7245 else if(Playing && !Paused)
3767 7245 wavy--; // Wavy was set by a script. Decrement it.
3768
3769
5/6
✓ Branch 0 taken 2147585 times.
✓ Branch 1 taken 18300 times.
✓ Branch 2 taken 36956 times.
✓ Branch 3 taken 2110629 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 36956 times.
2165885 if(Playing && msgpos && !screenscrolling)
3770 {
3771
1/2
✓ Branch 0 taken 36956 times.
✗ Branch 1 not taken.
36956 if(!(msg_bg_display_buf->clip))
3772 36956 blit_msgstr_bg(framebuf,0,0,0,playing_field_offset,256,168);
3773
1/2
✓ Branch 0 taken 36956 times.
✗ Branch 1 not taken.
36956 if(!(msg_portrait_display_buf->clip))
3774 36956 blit_msgstr_prt(framebuf,0,0,0,playing_field_offset,256,168);
3775
1/2
✓ Branch 0 taken 36956 times.
✗ Branch 1 not taken.
36956 if(!(msg_txt_display_buf->clip))
3776 36956 blit_msgstr_fg(framebuf,0,0,0,playing_field_offset,256,168);
3777 36956 }
3778
3779 /*
3780 if(!(msg_txt_display_buf->clip) && Playing && msgpos && !screenscrolling)
3781 {
3782 BITMAP* subBmp = 0;
3783 masked_blit(msg_txt_display_buf,subBmp,0,0,0,playing_field_offset,256,168);
3784 // masked_blit(msg_txt_display_buf,subBmp,0,playing_field_offset,256,168);
3785 draw_trans_sprite(framebuf, subBmp, 0, playing_field_offset);
3786 destroy_bitmap(subBmp);
3787 //void draw_sprite_ex(BITMAP *bmp, BITMAP *sprite, int32_t x, int32_t y, int32_t mode, int32_t flip);
3788 // masked_blit(msg_txt_display_buf,framebuf,0,0,0,playing_field_offset,256,168);
3789 //void masked_blit(BITMAP *source, BITMAP *dest, int32_t source_x, int32_t source_y, int32_t dest_x, int32_t dest_y, int32_t width, int32_t height);
3790 }
3791 */
3792
3793
2/2
✓ Branch 0 taken 2155596 times.
✓ Branch 1 taken 10289 times.
2165885 bool nosubscr = (tmpscr->flags3&fNOSUBSCR && !(tmpscr->flags3&fNOSUBSCROFFSET));
3794
3795
2/2
✓ Branch 0 taken 2155596 times.
✓ Branch 1 taken 10289 times.
2165885 if(nosubscr)
3796 {
3797 10289 rectfill(panorama,0,0,255,passive_subscreen_height/2,0);
3798 10289 rectfill(panorama,0,168+passive_subscreen_height/2,255,168+passive_subscreen_height-1,0);
3799 10289 blit(wavybuf,panorama,0,playing_field_offset,0,passive_subscreen_height/2,256,224-passive_subscreen_height);
3800 10289 }
3801
3802 //TODO: Optimize blit 'overcalls' -Gleeok
3803
2/2
✓ Branch 0 taken 10289 times.
✓ Branch 1 taken 2155596 times.
2165885 BITMAP *source = nosubscr ? panorama : wavybuf;
3804 2165885 blit(source,framebuf,0,0,0,0,256,224);
3805
3806 2165885 update_hw_screen();
3807 2165885 }
3808
3809 //----------------------------------------------------------------
3810
3811 PALETTE sys_pal;
3812
3813 int32_t onGUISnapshot()
3814 {
3815 char buf[200];
3816 int32_t num=0;
3817 bool realpal=(key[KEY_ZC_LCONTROL] || key[KEY_ZC_RCONTROL]);
3818 do
3819 {
3820 sprintf(buf, "%szc_screen%05d.%s", get_snap_str(), ++num, snapshotformat_str[SnapshotFormat][1]);
3821 }
3822 while(num<99999 && exists(buf));
3823
3824 BITMAP *b = create_bitmap_ex(8,resx,resy);
3825
3826 if(b)
3827 {
3828 if(MenuOpen)
3829 {
3830 //Cannot load game's palette while GUI elements are in focus. -Z
3831 //If there is a way to do this, then I have missed it.
3832 /*
3833 game_pal();
3834 RAMpal[253] = _RGB(0,0,0);
3835 RAMpal[254] = _RGB(63,63,63);
3836 set_palette_range(RAMpal,0,255,false);
3837 memcpy(RAMpal, snappal, sizeof(snappal));
3838 create_rgb_table(&rgb_table, RAMpal, NULL);
3839 create_zc_trans_table(&trans_table, RAMpal, 128, 128, 128);
3840 memcpy(&trans_table2, &trans_table, sizeof(COLOR_MAP));
3841
3842 for(int32_t q=0; q<PAL_SIZE; q++)
3843 {
3844 trans_table2.data[0][q] = q;
3845 trans_table2.data[q][q] = q;
3846 }
3847 */
3848 //ringcolor(false);
3849 //get_palette(RAMpal);
3850 blit(screen,b,0,0,0,0,resx,resy);
3851 //al_trace("Menu Open\n");
3852 //game_pal();
3853 //PALETTE temppal;
3854 //get_palette(temppal);
3855 //system_pal();
3856 save_bitmap(buf,b,sys_pal);
3857 //save_bitmap(buf,b,RAMpal);
3858 //save_bitmap(buf,b,snappal);
3859 }
3860 else
3861 {
3862 blit(screen,b,0,0,0,0,resx,resy);
3863 save_bitmap(buf,b,realpal?sys_pal:RAMpal);
3864 }
3865 destroy_bitmap(b);
3866 }
3867
3868 return D_O_K;
3869 }
3870
3871 int32_t onNonGUISnapshot()
3872 {
3873 PALETTE temppal;
3874 get_palette(temppal);
3875 bool realpal=(zc_getkey(KEY_ZC_LCONTROL, true) || zc_getkey(KEY_ZC_RCONTROL, true));
3876
3877 char buf[200];
3878 int32_t num=0;
3879
3880 do
3881 {
3882 sprintf(buf, "%szc_screen%05d.%s", get_snap_str(), ++num, snapshotformat_str[SnapshotFormat][1]);
3883 }
3884 while(num<99999 && exists(buf));
3885
3886 BITMAP *panorama = create_bitmap_ex(8,256,168);
3887 /*
3888 PALETTE tempRAMpal;
3889 get_palette(tempRAMpal);
3890
3891 if(tmpscr->flags3&fNOSUBSCR)
3892 {
3893 clear_to_color(panorama,0);
3894 blit(framebuf,panorama,0,playing_field_offset,0,0,256,168);
3895 save_bitmap(buf,panorama,realpal?temppal:tempRAMpal);
3896 }
3897 else
3898 {
3899 save_bitmap(buf,framebuf,realpal?temppal:tempRAMpal);
3900 }
3901
3902 destroy_bitmap(panorama);
3903 return D_O_K;
3904 */
3905 if(tmpscr->flags3&fNOSUBSCR && !(key[KEY_ALT]))
3906 {
3907 clear_to_color(panorama,0);
3908 blit(framebuf,panorama,0,playing_field_offset,0,0,256,168);
3909 save_bitmap(buf,panorama,realpal?temppal:RAMpal);
3910 }
3911 else
3912 {
3913 save_bitmap(buf,framebuf,realpal?temppal:RAMpal);
3914 }
3915
3916 destroy_bitmap(panorama);
3917 return D_O_K;
3918 }
3919
3920 int32_t onSnapshot()
3921 {
3922 if(zc_getkey(KEY_LSHIFT, true)||zc_getkey(KEY_RSHIFT, true))
3923 {
3924 onGUISnapshot();
3925 }
3926 else
3927 {
3928 onNonGUISnapshot();
3929 }
3930
3931 return D_O_K;
3932 }
3933
3934 int32_t onSaveMapPic()
3935 {
3936 int32_t mapres2 = 0;
3937 char buf[200];
3938 int32_t num=0;
3939 mapscr tmpscr_b[2];
3940 mapscr tmpscr_c[6];
3941 BITMAP* _screen_draw_buffer = NULL;
3942 _screen_draw_buffer = create_bitmap_ex(8,256,224);
3943 set_clip_state(_screen_draw_buffer,1);
3944
3945 for(int32_t i=0; i<6; ++i)
3946 {
3947 tmpscr_c[i] = tmpscr2[i];
3948 tmpscr2[i].zero_memory();
3949
3950 if(i>=2)
3951 {
3952 continue;
3953 }
3954
3955 tmpscr_b[i] = tmpscr[i];
3956 tmpscr[i].zero_memory();
3957 }
3958
3959 do
3960 {
3961 sprintf(buf, "%szc_screen%05d.png", get_snap_str(), ++num);
3962 }
3963 while(num<99999 && exists(buf));
3964
3965 BITMAP* mappic = NULL;
3966
3967
3968 bool done=false, redraw=true;
3969
3970 mappic = create_bitmap_ex(8,(256*16)>>mapres,(176*8)>>mapres);
3971
3972 if(!mappic)
3973 {
3974 system_pal();
3975 jwin_alert("View Map","Not enough memory.",NULL,NULL,"OK",NULL,13,27,lfont);
3976 game_pal();
3977 return D_O_K;;
3978 }
3979
3980 // draw the map
3981 set_clip_rect(_screen_draw_buffer, 0, 0, _screen_draw_buffer->w, _screen_draw_buffer->h);
3982
3983 for(int32_t y=0; y<8; y++)
3984 {
3985 for(int32_t x=0; x<16; x++)
3986 {
3987 if(!displayOnMap(x, y))
3988 {
3989 rectfill(_screen_draw_buffer, 0, 0, 255, 223, WHITE);
3990 }
3991 else
3992 {
3993 int32_t s = (y<<4) + x;
3994 loadscr2(1,s,-1);
3995
3996 for(int32_t i=0; i<6; i++)
3997 {
3998 if(tmpscr[1].layermap[i]<=0)
3999 continue;
4000
4001 if((ZCMaps[tmpscr[1].layermap[i]-1].tileWidth==ZCMaps[currmap].tileWidth) &&
4002 (ZCMaps[tmpscr[1].layermap[i]-1].tileHeight==ZCMaps[currmap].tileHeight))
4003 {
4004 const int32_t _mapsSize = (ZCMaps[currmap].tileWidth)*(ZCMaps[currmap].tileHeight);
4005
4006 tmpscr2[i]=TheMaps[(tmpscr[1].layermap[i]-1)*MAPSCRS+tmpscr[1].layerscreen[i]];
4007 }
4008 }
4009
4010 if(XOR((tmpscr+1)->flags7&fLAYER2BG, DMaps[currdmap].flags&dmfLAYER2BG)) do_layer(_screen_draw_buffer, 0, 2, tmpscr+1, -256, playing_field_offset, 2);
4011
4012 if(XOR((tmpscr+1)->flags7&fLAYER3BG, DMaps[currdmap].flags&dmfLAYER3BG)) do_layer(_screen_draw_buffer, 0, 3, tmpscr+1, -256, playing_field_offset, 2);
4013
4014 putscr(_screen_draw_buffer,256,0,tmpscr+1);
4015 do_layer(_screen_draw_buffer, 0, 1, tmpscr+1, -256, playing_field_offset, 2);
4016
4017 if(!XOR((tmpscr+1)->flags7&fLAYER2BG, DMaps[currdmap].flags&dmfLAYER2BG)) do_layer(_screen_draw_buffer, 0, 2, tmpscr+1, -256, playing_field_offset, 2);
4018
4019 putscrdoors(_screen_draw_buffer,256,0,tmpscr+1);
4020 do_layer(_screen_draw_buffer, -2, 0, tmpscr+1, -256, playing_field_offset, 2);
4021 if(get_bit(quest_rules, qr_PUSHBLOCK_LAYER_1_2))
4022 {
4023 do_layer(_screen_draw_buffer, -2, 1, tmpscr+1, -256, playing_field_offset, 2);
4024 do_layer(_screen_draw_buffer, -2, 2, tmpscr+1, -256, playing_field_offset, 2);
4025 }
4026 do_layer(_screen_draw_buffer, -3, 0, tmpscr+1, -256, playing_field_offset, 2); // Freeform combos!
4027
4028 if(!XOR((tmpscr+1)->flags7&fLAYER3BG, DMaps[currdmap].flags&dmfLAYER3BG)) do_layer(_screen_draw_buffer, 0, 3, tmpscr+1, -256, playing_field_offset, 2);
4029
4030 do_layer(_screen_draw_buffer, 0, 4, tmpscr+1, -256, playing_field_offset, 2);
4031 do_layer(_screen_draw_buffer, -1, 0, tmpscr+1, -256, playing_field_offset, 2);
4032 if(get_bit(quest_rules, qr_OVERHEAD_COMBOS_L1_L2))
4033 {
4034 do_layer(_screen_draw_buffer, -1, 1, tmpscr+1, -256, playing_field_offset, 2);
4035 do_layer(_screen_draw_buffer, -1, 2, tmpscr+1, -256, playing_field_offset, 2);
4036 }
4037 do_layer(_screen_draw_buffer, 0, 5, tmpscr+1, -256, playing_field_offset, 2);
4038 do_layer(_screen_draw_buffer, 0, 6, tmpscr+1, -256, playing_field_offset, 2);
4039
4040 }
4041
4042 stretch_blit(_screen_draw_buffer, mappic, 256, 0, 256, 176, x<<(8-mapres), (y*176)>>mapres, 256>>mapres, 176>>mapres);
4043 }
4044 }
4045
4046 for(int32_t i=0; i<6; ++i)
4047 {
4048 tmpscr2[i]=tmpscr_c[i];
4049
4050 if(i>=2)
4051 {
4052 continue;
4053 }
4054
4055 tmpscr[i]=tmpscr_b[i];
4056 }
4057
4058 save_bitmap(buf,mappic,RAMpal);
4059 destroy_bitmap(mappic);
4060 destroy_bitmap(_screen_draw_buffer);
4061 return D_O_K;
4062 }
4063
4064 /*
4065 int32_t onSaveMapPic()
4066 {
4067 BITMAP* mappic = NULL;
4068 BITMAP* _screen_draw_buffer = NULL;
4069 _screen_draw_buffer = create_bitmap_ex(8,256,224);
4070 int32_t mapres2 = 0;
4071 char buf[20];
4072 int32_t num=0;
4073 set_clip_state(_screen_draw_buffer,1);
4074 set_clip_rect(_screen_draw_buffer,0,0,_screen_draw_buffer->w, _screen_draw_buffer->h);
4075
4076 do
4077 {
4078 sprintf(buf, "zelda%03d.png", ++num);
4079 }
4080 while(num<999 && exists(buf));
4081
4082 // if(!mappic) {
4083 mappic = create_bitmap_ex(8,(256*16)>>mapres2,(176*8)>>mapres2);
4084
4085 if(!mappic)
4086 {
4087 system_pal();
4088 jwin_alert("Save Map Picture","Not enough memory.",NULL,NULL,"OK",NULL,13,27,lfont);
4089 game_pal();
4090 return D_O_K;
4091 }
4092
4093 // }
4094
4095 int32_t layermap, layerscreen;
4096 int32_t x2=0;
4097
4098 // draw the map
4099 for(int32_t y=0; y<8; y++)
4100 {
4101 for(int32_t x=0; x<16; x++)
4102 {
4103 int32_t s = (y<<4) + x;
4104
4105 if(!displayOnMap(x, y))
4106 {
4107 rectfill(_screen_draw_buffer, 0, 0, 255, 223, WHITE);
4108 }
4109 else
4110 {
4111 loadscr(TEMPSCR_FUNCTION_SWAP_SPACE,currdmap,s,-1,false);
4112 putscr(_screen_draw_buffer, 0, 0, tmpscr+1);
4113
4114 for(int32_t k=0; k<4; k++)
4115 {
4116 if(k==2)
4117 {
4118 putscrdoors(_screen_draw_buffer, 0, 0, tmpscr+1);
4119 }
4120
4121 layermap=TheMaps[currmap*MAPSCRS+s].layermap[k]-1;
4122
4123 if(layermap>-1)
4124 {
4125 layerscreen=layermap*MAPSCRS+TheMaps[currmap*MAPSCRS+s].layerscreen[k];
4126
4127 if(TheMaps[currmap*MAPSCRS+s].layeropacity[k]==255)
4128 {
4129 for(int32_t i=0; i<176; i++)
4130 {
4131 overcombo(_screen_draw_buffer,((i&15)<<4)+x2,(i&0xF0),TheMaps[layerscreen].data[i],TheMaps[layerscreen].cset[i]);
4132 }
4133 }
4134 else
4135 {
4136 for(int32_t i=0; i<176; i++)
4137 {
4138 overcombotranslucent(_screen_draw_buffer,((i&15)<<4)+x2,(i&0xF0),TheMaps[layerscreen].data[i],TheMaps[layerscreen].cset[i],TheMaps[currmap*MAPSCRS+s].layeropacity[k]);
4139 }
4140 }
4141 }
4142 }
4143
4144 for(int32_t i=0; i<176; i++)
4145 {
4146 // if (COMBOTYPE((i&15)<<4,i&0xF0)==cOLD_OVERHEAD)
4147 if(combo_class_buf[COMBOTYPE((i&15)<<4,i&0xF0)].overhead)
4148 {
4149 overcombo(_screen_draw_buffer,((i&15)<<4)+x2,(i&0xF0),MAPCOMBO((i&15)<<4,i&0xF0),MAPCSET((i&15)<<4,i&0xF0));
4150 }
4151 }
4152
4153 for(int32_t k=4; k<6; k++)
4154 {
4155 layermap=TheMaps[currmap*MAPSCRS+s].layermap[k]-1;
4156
4157 if(layermap>-1)
4158 {
4159 layerscreen=layermap*MAPSCRS+TheMaps[currmap*MAPSCRS+s].layerscreen[k];
4160
4161 if(TheMaps[currmap*MAPSCRS+s].layeropacity[k]==255)
4162 {
4163 for(int32_t i=0; i<176; i++)
4164 {
4165 overcombo(_screen_draw_buffer,((i&15)<<4)+x2,(i&0xF0),TheMaps[layerscreen].data[i],TheMaps[layerscreen].cset[i]);
4166 }
4167 }
4168 else
4169 {
4170 for(int32_t i=0; i<176; i++)
4171 {
4172 overcombotranslucent(_screen_draw_buffer,((i&15)<<4)+x2,(i&0xF0),TheMaps[layerscreen].data[i],TheMaps[layerscreen].cset[i],TheMaps[currmap*MAPSCRS+s].layeropacity[k]);
4173 }
4174 }
4175 }
4176 }
4177 }
4178
4179 stretch_blit(_screen_draw_buffer, mappic, 0, 0, 256, 176,
4180 x<<(8-mapres2), (y*176)>>mapres2, 256>>mapres2, 176>>mapres2);
4181 }
4182
4183 }
4184
4185 save_bitmap(buf,mappic,RAMpal);
4186 destroy_bitmap(mappic);
4187 destroy_bitmap(_screen_draw_buffer);
4188 return D_O_K;
4189 }
4190 */
4191
4192 14 void f_Quit(int32_t type)
4193 {
4194
2/4
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 if(type==qQUIT && !Playing)
4195 return;
4196
4197 14 bool from_menu = is_sys_pal;
4198
4199
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if(!from_menu)
4200 {
4201 14 music_pause();
4202 14 pause_all_sfx();
4203 14 }
4204 14 enter_sys_pal();
4205 14 clear_keybuf();
4206
4207 14 replay_poll();
4208
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if (replay_is_replaying())
4209 14 replay_peek_quit();
4210
4211
1/2
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
14 if (!replay_is_replaying())
4212 switch(type)
4213 {
4214 case qQUIT:
4215 onQuit();
4216 break;
4217
4218 case qRESET:
4219 onReset();
4220 break;
4221
4222 case qEXIT:
4223 onExit();
4224 break;
4225 }
4226
4227
1/2
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
14 if(Quit)
4228 {
4229 14 kill_sfx();
4230 14 music_stop();
4231 14 exit_sys_pal();
4232 14 update_hw_screen();
4233 14 }
4234 else
4235 {
4236 exit_sys_pal();
4237 if(!from_menu)
4238 {
4239 music_resume();
4240 resume_all_sfx();
4241 }
4242 }
4243
4244
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if(!from_menu)
4245 14 show_mouse(NULL);
4246 14 eat_buttons();
4247
4248 14 zc_readrawkey(KEY_ESC);
4249
4250 14 zc_readrawkey(KEY_ENTER);
4251 14 }
4252
4253 //----------------------------------------------------------------
4254
4255 int32_t onNoWalls()
4256 {
4257 cheats_enqueue(Cheat::Walls);
4258 return D_O_K;
4259 }
4260
4261 int32_t onIgnoreSideview()
4262 {
4263 cheats_enqueue(Cheat::IgnoreSideView);
4264 return D_O_K;
4265 }
4266
4267 2204025 int32_t input_idle(bool checkmouse)
4268 {
4269 static int32_t mx, my, mz, mb;
4270
4271
4/6
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 404478 times.
✓ Branch 3 taken 1799547 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 404478 times.
2608503 if(keypressed() || zc_key_pressed() ||
4272
4/8
✓ Branch 0 taken 404478 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 404478 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 404478 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 404478 times.
✗ Branch 7 not taken.
404478 (checkmouse && (mx != mouse_x || my != mouse_y || mz != mouse_z || mb != mouse_b)))
4273 {
4274 1799547 idle_count = 0;
4275
4276
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1799547 times.
1799547 if(active_count < MAX_ACTIVE)
4277 {
4278 1799547 ++active_count;
4279 1799547 }
4280 1799547 }
4281
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 404478 times.
404478 else if(idle_count < MAX_IDLE)
4282 {
4283 404478 ++idle_count;
4284 404478 active_count = 0;
4285 404478 }
4286
4287 2204025 mx = mouse_x;
4288 2204025 my = mouse_y;
4289 2204025 mz = mouse_z;
4290 2204025 mb = mouse_b;
4291
4292 2204025 return idle_count;
4293 }
4294
4295 int32_t onGoFast()
4296 {
4297 cheats_enqueue(Cheat::Fast);
4298 return D_O_K;
4299 }
4300
4301 int32_t onKillCheat()
4302 {
4303 cheats_enqueue(Cheat::Kill);
4304 return D_O_K;
4305 }
4306
4307 int32_t onShowLayer0()
4308 {
4309 show_layer_0 = !show_layer_0;
4310 return D_O_K;
4311 }
4312 int32_t onShowLayer1()
4313 {
4314 show_layer_1 = !show_layer_1;
4315 return D_O_K;
4316 }
4317 int32_t onShowLayer2()
4318 {
4319 show_layer_2 = !show_layer_2;
4320 return D_O_K;
4321 }
4322 int32_t onShowLayer3()
4323 {
4324 show_layer_3 = !show_layer_3;
4325 return D_O_K;
4326 }
4327 int32_t onShowLayer4()
4328 {
4329 show_layer_4 = !show_layer_4;
4330 return D_O_K;
4331 }
4332 int32_t onShowLayer5()
4333 {
4334 show_layer_5 = !show_layer_5;
4335 return D_O_K;
4336 }
4337 int32_t onShowLayer6()
4338 {
4339 show_layer_6 = !show_layer_6;
4340 return D_O_K;
4341 }
4342 int32_t onShowLayerO()
4343 {
4344 show_layer_over=!show_layer_over;
4345 return D_O_K;
4346 }
4347 int32_t onShowLayerP()
4348 {
4349 show_layer_push=!show_layer_push;
4350 return D_O_K;
4351 }
4352 int32_t onShowLayerS()
4353 {
4354 show_sprites=!show_sprites;
4355 return D_O_K;
4356 }
4357 int32_t onShowLayerF()
4358 {
4359 show_ffcs=!show_ffcs;
4360 return D_O_K;
4361 }
4362 int32_t onShowLayerW()
4363 {
4364 show_walkflags=!show_walkflags;
4365 return D_O_K;
4366 }
4367 int32_t onShowLayerE()
4368 {
4369 show_effectflags=!show_effectflags;
4370 return D_O_K;
4371 }
4372 int32_t onShowFFScripts()
4373 {
4374 show_ff_scripts=!show_ff_scripts;
4375 return D_O_K;
4376 }
4377 int32_t onShowHitboxes()
4378 {
4379 show_hitboxes=!show_hitboxes;
4380 return D_O_K;
4381 }
4382
4383 int32_t onLightSwitch()
4384 {
4385 cheats_enqueue(Cheat::Light);
4386 return D_O_K;
4387 }
4388
4389 int32_t onGoTo();
4390 int32_t onGoToComplete();
4391
4392 2204025 void syskeys()
4393 {
4394 2204025 update_system_keys();
4395
4396 int32_t oldtitle_version;
4397
4398
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(close_button_quit)
4399 {
4400 close_button_quit=false;
4401 f_Quit(qEXIT);
4402 }
4403
4404 2204025 poll_joystick();
4405
4406
2/10
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2204025 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2204025 if(rMbtn() || (gui_mouse_b() && !mouse_down && ClickToFreeze &&!disableClickToFreeze))
4407 {
4408 oldtitle_version=title_version;
4409 System();
4410 }
4411
4412 2204025 mouse_down=gui_mouse_b();
4413
4414
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(zc_read_system_key(KEY_F1))
4415 {
4416 if(zc_get_system_key(KEY_ZC_LCONTROL) || zc_get_system_key(KEY_ZC_RCONTROL))
4417 {
4418 halt=!halt;
4419 //zinit.subscreen=(zinit.subscreen+1)%ssdtMAX;
4420 }
4421 else
4422 {
4423 Throttlefps=!Throttlefps;
4424 zc_set_config(cfg_sect,"throttlefps", (int32_t)Throttlefps);
4425 logic_counter=0;
4426 }
4427 }
4428
4429 // if(zc_readkey(KEY_F1)) Vsync=!Vsync;
4430 /*
4431 if(zc_readkey(KEY_F1)) set_bit(QHeader.rules4,qr4_NEWENEMYTILES,
4432 1-((get_bit(QHeader.rules4,qr4_NEWENEMYTILES))));
4433 */
4434
4435
1/4
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2204025 if(zc_read_system_key(KEY_OPENBRACE)) if(frame_rest_suggest > 0) frame_rest_suggest--;
4436
4437
1/4
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2204025 if(zc_read_system_key(KEY_CLOSEBRACE)) if(frame_rest_suggest <= 2) frame_rest_suggest++;
4438
4439
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(zc_read_system_key(KEY_F2))
4440 {
4441 ShowFPS=!ShowFPS;
4442 zc_set_config(cfg_sect,"showfps",(int32_t)ShowFPS);
4443 }
4444
4445
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2204025 if(zc_read_system_key(KEY_F3) && Playing) Paused=!Paused;
4446
4447
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2204025 if(zc_read_system_key(KEY_F4) && Playing)
4448 {
4449 Paused=true;
4450 Advance=true;
4451 }
4452
4453
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(zc_read_system_key(KEY_F6)) onTryQuit();
4454
4455 #ifndef ALLEGRO_MACOSX
4456
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(zc_read_system_key(KEY_F9)) f_Quit(qRESET);
4457
4458
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(zc_read_system_key(KEY_F10)) f_Quit(qEXIT);
4459 #else
4460 if(zc_read_system_key(KEY_F7)) f_Quit(qRESET);
4461
4462 if(zc_read_system_key(KEY_F8)) f_Quit(qEXIT);
4463 #endif
4464
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2204025 if(zc_read_system_key(KEY_F5)&&(Playing && currscr<128 && DMaps[currdmap].flags&dmfVIEWMAP)) onSaveMapPic();
4465
4466
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if (zc_read_system_key(KEY_F12))
4467 {
4468 onSnapshot();
4469 }
4470
4471
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2204025 if(debug_enabled && zc_read_system_key(KEY_TAB))
4472 set_debug(!get_debug());
4473
4474
3/4
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18730 times.
✓ Branch 3 taken 2185295 times.
2204025 if(get_debug() || cheat>=1)
4475 {
4476
1/2
✓ Branch 0 taken 18730 times.
✗ Branch 1 not taken.
18730 if( CheatModifierKeys() )
4477 {
4478 if(zc_readkey(KEY_ASTERISK) || zc_readkey(KEY_H)) cheats_enqueue(Cheat::Life, game->get_maxlife());
4479
4480 if(zc_readkey(KEY_SLASH_PAD) || zc_readkey(KEY_M)) cheats_enqueue(Cheat::Magic, game->get_maxmagic());
4481
4482 if(zc_readkey(KEY_R)) cheats_enqueue(Cheat::Rupies, game->get_maxcounter(1));
4483
4484 if(zc_readkey(KEY_B))
4485 {
4486 cheats_enqueue(Cheat::Bombs, game->get_maxbombs(), game->get_maxcounter(6));
4487 }
4488
4489 if(zc_readkey(KEY_A))
4490 {
4491 cheats_enqueue(Cheat::Arrows, game->get_maxarrows());
4492 }
4493 }
4494 18730 }
4495
4496
3/4
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18730 times.
✓ Branch 3 taken 2185295 times.
2204025 if(get_debug() || cheat>=2)
4497 {
4498
1/2
✓ Branch 0 taken 18730 times.
✗ Branch 1 not taken.
18730 if( CheatModifierKeys() )
4499 {
4500 if(rI())
4501 {
4502 cheats_enqueue(Cheat::Clock);
4503 }
4504 }
4505 18730 }
4506
4507
3/4
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18730 times.
✓ Branch 3 taken 2185295 times.
2204025 if(get_debug() || cheat>=4)
4508 {
4509
1/2
✓ Branch 0 taken 18730 times.
✗ Branch 1 not taken.
18730 if( CheatModifierKeys() )
4510 {
4511 if(rF11())
4512 {
4513 cheats_enqueue(Cheat::Walls);
4514 }
4515
4516 if(rQ())
4517 {
4518 cheats_enqueue(Cheat::Fast);
4519 }
4520
4521 if(zc_readkey(KEY_F))
4522 {
4523 cheats_enqueue(Cheat::Freeze);
4524 }
4525
4526 if(zc_readkey(KEY_G)) onGoToComplete();
4527
4528 if(zc_readkey(KEY_0)) onShowLayer0();
4529
4530 if(zc_readkey(KEY_1)) onShowLayer1();
4531
4532 if(zc_readkey(KEY_2)) onShowLayer2();
4533
4534 if(zc_readkey(KEY_3)) onShowLayer3();
4535
4536 if(zc_readkey(KEY_4)) onShowLayer4();
4537
4538 if(zc_readkey(KEY_5)) onShowLayer5();
4539
4540 if(zc_readkey(KEY_6)) onShowLayer6();
4541
4542 //if(zc_readkey(KEY_7)) onShowLayerO();
4543 if(zc_readkey(KEY_7)) onShowLayerF();
4544
4545 if(zc_readkey(KEY_8)) onShowLayerS();
4546
4547 if(zc_readkey(KEY_W)) onShowLayerW();
4548
4549 if(zc_readkey(KEY_L)) cheats_enqueue(Cheat::Light);
4550
4551 if(zc_readkey(KEY_V)) cheats_enqueue(Cheat::IgnoreSideView);
4552
4553 if(zc_readkey(KEY_K)) cheats_enqueue(Cheat::Kill);
4554 if(zc_readkey(KEY_O)) onShowLayerO();
4555 if(zc_readkey(KEY_P)) onShowLayerP();
4556 if(zc_readkey(KEY_C)) onShowHitboxes();
4557 if(zc_readkey(KEY_F)) onShowFFScripts();
4558 }
4559 18730 }
4560
4561
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(volkeys)
4562 {
4563 if(zc_read_system_key(KEY_PGUP)) master_volume(-1,midi_volume+8);
4564
4565 if(zc_read_system_key(KEY_PGDN)) master_volume(-1,midi_volume==255?248:midi_volume-8);
4566
4567 if(zc_read_system_key(KEY_HOME)) master_volume(digi_volume+8,-1);
4568
4569 if(zc_read_system_key(KEY_END)) master_volume(digi_volume==255?248:digi_volume-8,-1);
4570 }
4571
4572
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2204025 if(!get_debug() || !SystemKeys || replay_is_replaying())
4573 2204025 goto bottom;
4574
4575 if(zc_readkey(KEY_D))
4576 {
4577 details = !details;
4578 rectfill(screen,0,0,319,7,BLACK);
4579 rectfill(screen,0,8,31,239,BLACK);
4580 rectfill(screen,288,8,319,239,BLACK);
4581 rectfill(screen,32,232,287,239,BLACK);
4582 }
4583
4584 if(zc_readkey(KEY_P)) Paused=!Paused;
4585
4586 //if(zc_readkey(KEY_P)) centerHero();
4587 if(zc_readkey(KEY_A))
4588 {
4589 Paused=true;
4590 Advance=true;
4591 }
4592
4593 if(zc_readkey(KEY_G)) db=(db==999)?0:999;
4594 #ifndef ALLEGRO_MACOSX
4595 if(zc_readkey(KEY_F8)) Showpal=!Showpal;
4596
4597 if(zc_readkey(KEY_F7))
4598 {
4599 Matrix(ss_speed, ss_density, 0);
4600 game_pal();
4601 }
4602 #else
4603 // The reason these are different on Mac in the first place is that
4604 // the OS doesn't let us use F9 and F10...
4605 if(zc_readkey(KEY_F10)) Showpal=!Showpal;
4606
4607 if(zc_readkey(KEY_F9))
4608 {
4609 Matrix(ss_speed, ss_density, 0);
4610 game_pal();
4611 }
4612 #endif
4613 if(zc_readkey(KEY_PLUS_PAD) || zc_readkey(KEY_EQUALS))
4614 {
4615 //change containers
4616 if(zc_getkey(KEY_ZC_LCONTROL) || zc_getkey(KEY_ZC_RCONTROL))
4617 {
4618 //magic containers
4619 if(zc_getkey(KEY_LSHIFT) || zc_getkey(KEY_RSHIFT))
4620 {
4621 game->set_maxmagic(zc_min(game->get_maxmagic()+game->get_mp_per_block(),game->get_mp_per_block()*8));
4622 }
4623 else
4624 {
4625 game->set_maxlife(zc_min(game->get_maxlife()+game->get_hp_per_heart(),game->get_hp_per_heart()*24));
4626 }
4627 }
4628 else
4629 {
4630 if(zc_getkey(KEY_LSHIFT) || zc_getkey(KEY_RSHIFT))
4631 {
4632 game->set_magic(zc_min(game->get_magic()+1,game->get_maxmagic()));
4633 }
4634 else
4635 {
4636 game->set_life(zc_min(game->get_life()+1,game->get_maxlife()));
4637 }
4638 }
4639 }
4640
4641 if(zc_readkey(KEY_MINUS_PAD) || zc_readkey(KEY_MINUS))
4642 {
4643 //change containers
4644 if(zc_getkey(KEY_ZC_LCONTROL) || zc_getkey(KEY_ZC_RCONTROL))
4645 {
4646 //magic containers
4647 if(zc_getkey(KEY_LSHIFT) || zc_getkey(KEY_RSHIFT))
4648 {
4649 game->set_maxmagic(zc_max(game->get_maxmagic()-game->get_mp_per_block(),0));
4650 game->set_magic(zc_min(game->get_maxmagic(), game->get_magic()));
4651 //heart containers
4652 }
4653 else
4654 {
4655 game->set_maxlife(zc_max(game->get_maxlife()-game->get_hp_per_heart(),game->get_hp_per_heart()));
4656 game->set_life(zc_min(game->get_maxlife(), game->get_life()));
4657 }
4658 }
4659 else
4660 {
4661 if(zc_getkey(KEY_LSHIFT) || zc_getkey(KEY_RSHIFT))
4662 {
4663 game->set_magic(zc_max(game->get_magic()-1,0));
4664 }
4665 else
4666 {
4667 game->set_life(zc_max(game->get_life()-1,0));
4668 }
4669 }
4670 }
4671
4672 if(zc_readkey(KEY_COMMA)) jukebox(currmidi-1);
4673
4674 if(zc_readkey(KEY_STOP)) jukebox(currmidi+1);
4675
4676 verifyBothWeapons();
4677
4678 bottom:
4679
4680
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(input_idle(true) > after_time())
4681 {
4682 Matrix(ss_speed, ss_density, 0);
4683 game_pal();
4684 }
4685 //Saffith's method of separating system and game key bindings. Can't do this!!
4686 //restoreInput(); //This caused input to become randomly 'stuck'. -Z
4687
4688 //while(Playing && keypressed())
4689 //readkey();
4690 // What's the Playing check for?
4691 2204025 clear_keybuf();
4692 2204025 }
4693
4694 13384240 void checkQuitKeys()
4695 {
4696 #ifndef ALLEGRO_MACOSX
4697
1/2
✓ Branch 0 taken 13384240 times.
✗ Branch 1 not taken.
13384240 if(zc_readrawkey(KEY_F9)) f_Quit(qRESET);
4698
4699
1/2
✓ Branch 0 taken 13384240 times.
✗ Branch 1 not taken.
13384240 if(zc_readrawkey(KEY_F10)) f_Quit(qEXIT);
4700 #else
4701 if(zc_readrawkey(KEY_F7)) f_Quit(qRESET);
4702
4703 if(zc_readrawkey(KEY_F8)) f_Quit(qEXIT);
4704 #endif
4705 13384240 }
4706
4707 56190 bool CheatModifierKeys()
4708 {
4709 // Cheats are replayed via the X cheat step, no need to check for keyboard input
4710 // to trigger cheats.
4711
1/2
✓ Branch 0 taken 56190 times.
✗ Branch 1 not taken.
56190 if (replay_is_replaying())
4712 56190 return false;
4713
4714 if ( ( cheat_modifier_keys[0] > 0 && key[cheat_modifier_keys[0]] ) ||
4715 ( cheat_modifier_keys[1] > 0 && key[cheat_modifier_keys[1]] ) ||
4716 (cheat_modifier_keys[0] <= 0 && cheat_modifier_keys[1] <= 0))
4717 {
4718 if ( ( cheat_modifier_keys[2] <= 0 || key[cheat_modifier_keys[2]] ) ||
4719 ( cheat_modifier_keys[3] > 0 && key[cheat_modifier_keys[3]] ) ||
4720 (cheat_modifier_keys[2] <= 0 && cheat_modifier_keys[3] <= 0))
4721 {
4722 return true;
4723 }
4724 }
4725 return false;
4726 56190 }
4727
4728 //99:05:54, for some reason?
4729 #define OLDMAXTIME 21405240
4730 //9000:00:00, the highest even-thousand hour fitting within 32b signed. This is 375 *DAYS*.
4731 #define MAXTIME 1944000000
4732
4733 2165895 void advanceframe(bool allowwavy, bool sfxcleanup, bool allowF6Script)
4734 {
4735
2/2
✓ Branch 0 taken 1920268 times.
✓ Branch 1 taken 245627 times.
2165895 if(zcmusic!=NULL)
4736 {
4737 245627 zcmusic_poll();
4738 245627 }
4739
4740
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2165895 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2165895 times.
2165895 while(Paused && !Advance && !Quit)
4741 {
4742 // have to call this, otherwise we'll get an infinite loop
4743 syskeys();
4744 if(allowF6Script)
4745 {
4746 FFCore.runF6Engine();
4747 }
4748 if (replay_get_mode() != ReplayMode::Assert)
4749 updatescr(allowwavy);
4750 throttleFPS();
4751
4752 #ifdef _WIN32
4753
4754 if(use_dwm_flush)
4755 {
4756 do_DwmFlush();
4757 }
4758
4759 #endif
4760
4761 // to keep music playing
4762 if(zcmusic!=NULL)
4763 {
4764 zcmusic_poll();
4765 }
4766
4767 update_hw_screen();
4768 }
4769
4770
2/2
✓ Branch 0 taken 2165885 times.
✓ Branch 1 taken 10 times.
2165895 if(Quit)
4771 10 return;
4772
4773
3/4
✓ Branch 0 taken 2147585 times.
✓ Branch 1 taken 18300 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2147585 times.
2165885 if(Playing && game->get_time()<unsigned(get_bit(quest_rules,qr_GREATER_MAX_TIME) ? MAXTIME : OLDMAXTIME))
4774 2147585 game->change_time(1);
4775
4776 2165885 Advance=false;
4777
4778 2165885 updatescr(allowwavy);
4779
4780
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2165883 times.
2165885 if (replay_is_active())
4781 {
4782
2/2
✓ Branch 0 taken 1270461 times.
✓ Branch 1 taken 895422 times.
2165883 if (replay_get_version() >= 3)
4783 895422 replay_poll();
4784
4785 // Replay compatability.
4786
4/4
✓ Branch 0 taken 115525 times.
✓ Branch 1 taken 2050358 times.
✓ Branch 2 taken 14990 times.
✓ Branch 3 taken 100535 times.
2165883 if (replay_get_version() >= 6 && replay_get_version() < 8)
4787 100535 replay_peek_input();
4788 2165883 }
4789
4790 2165885 update_keys();
4791
4792 2165885 ++frame;
4793
4794
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2165883 times.
2165885 if (replay_is_replaying())
4795 2165883 replay_do_cheats();
4796 2165885 syskeys();
4797
4798 // Cheats used via the System menu (called by syskeys) will call cheats_enqueue. syskeys
4799 // is called just above, and in the paused loop above, so the queue-and-defer-slightly
4800 // approach here means it doesn't matter which call adds the cheat.
4801 2165885 cheats_execute_queued();
4802
4803
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2165883 times.
2165885 if (replay_is_replaying())
4804 2165883 replay_peek_quit();
4805
2/2
✓ Branch 0 taken 2165871 times.
✓ Branch 1 taken 14 times.
2165885 if (GameFlags & GAMEFLAG_TRYQUIT)
4806 14 replay_step_quit(0);
4807
2/2
✓ Branch 0 taken 732 times.
✓ Branch 1 taken 2165153 times.
2165885 if(allowF6Script)
4808 {
4809 2165153 FFCore.runF6Engine();
4810 2165153 }
4811
2/2
✓ Branch 0 taken 2165798 times.
✓ Branch 1 taken 87 times.
2165885 if (Quit)
4812 87 replay_step_quit(Quit);
4813 // Someday... maybe install a Turbo button here?
4814 2165885 throttleFPS();
4815
4816 #ifdef _WIN32
4817
4818 if(use_dwm_flush)
4819 {
4820 do_DwmFlush();
4821 }
4822
4823 #endif
4824
4825 //textprintf_ex(screen,font,0,72,254,BLACK,"%d %d", lastentrance, lastentrance_dmap);
4826
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2165883 times.
2165885 if(sfxcleanup)
4827 2165883 sfx_cleanup();
4828 2165895 }
4829
4830 8 void zapout()
4831 {
4832 8 set_clip_rect(scrollbuf, 0, 0, scrollbuf->w, scrollbuf->h);
4833 8 blit(framebuf,scrollbuf,0,0,256,0,256,224);
4834
4835 8 FFCore.runGenericPassiveEngine(SCR_TIMING_END_FRAME);
4836 8 script_drawing_commands.Clear();
4837
4838 // zap out
4839
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 192 times.
200 for(int32_t i=1; i<=24; i++)
4840 {
4841 192 draw_fuzzy(i);
4842 192 syskeys();
4843 192 advanceframe(true);
4844
4845
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 192 times.
192 if(Quit)
4846 {
4847 break;
4848 }
4849 192 }
4850 8 }
4851
4852 8 void zapin()
4853 {
4854 8 FFCore.warpScriptCheck();
4855 8 draw_screen(tmpscr);
4856 8 set_clip_rect(scrollbuf, 0, 0, scrollbuf->w, scrollbuf->h);
4857 //put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,false,sspUP);
4858 8 blit(framebuf,scrollbuf,0,0,256,0,256,224);
4859
4860 // zap out
4861 8 FFCore.runGenericPassiveEngine(SCR_TIMING_END_FRAME);
4862
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 192 times.
200 for(int32_t i=24; i>=1; i--)
4863 {
4864 192 draw_fuzzy(i);
4865 192 syskeys();
4866 192 advanceframe(true);
4867
4868
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 192 times.
192 if(Quit)
4869 {
4870 break;
4871 }
4872 192 }
4873 8 }
4874
4875
4876 void wavyout(bool showhero)
4877 {
4878 draw_screen(tmpscr, showhero);
4879 //put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,false,sspUP);
4880
4881 BITMAP *wavebuf = create_bitmap_ex(8,288,224);
4882 clear_to_color(wavebuf,0);
4883 blit(framebuf,wavebuf,0,0,16,0,256,224);
4884
4885 static PALETTE wavepal;
4886
4887 int32_t ofs;
4888 int32_t amplitude=8;
4889
4890 int32_t wavelength=4;
4891 double palpos=0, palstep=4, palstop=126;
4892
4893 FFCore.runGenericPassiveEngine(SCR_TIMING_END_FRAME);
4894 for(int32_t i=0; i<168; i+=wavelength)
4895 {
4896 for(int32_t l=0; l<256; l++)
4897 {
4898 wavepal[l].r=vbound(int32_t(RAMpal[l].r+((palpos/palstop)*(63-RAMpal[l].r))),0,63);
4899 wavepal[l].g=vbound(int32_t(RAMpal[l].g+((palpos/palstop)*(63-RAMpal[l].g))),0,63);
4900 wavepal[l].b=vbound(int32_t(RAMpal[l].b+((palpos/palstop)*(63-RAMpal[l].b))),0,63);
4901 }
4902
4903 palpos+=palstep;
4904
4905 if(palpos>=0)
4906 {
4907 hw_palette = &wavepal;
4908 update_hw_pal = true;
4909 }
4910 else
4911 {
4912 hw_palette = &RAMpal;
4913 update_hw_pal = true;
4914 }
4915
4916 for(int32_t j=0; j+playing_field_offset<224; j++)
4917 {
4918 for(int32_t k=0; k<256; k++)
4919 {
4920 ofs=0;
4921
4922 if((j<i)&&(j&1))
4923 {
4924 ofs=int32_t(zc::math::Sin((double(i+j)*2*PI/168.0))*amplitude);
4925 }
4926
4927 framebuf->line[j+playing_field_offset][k]=wavebuf->line[j+playing_field_offset][k+ofs+16];
4928 }
4929 }
4930
4931 syskeys();
4932 advanceframe(true);
4933
4934 // animate_combos();
4935 if(Quit)
4936 break;
4937 }
4938
4939 destroy_bitmap(wavebuf);
4940 }
4941
4942 void wavyin()
4943 {
4944 draw_screen(tmpscr);
4945 //put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,false,sspUP);
4946
4947 BITMAP *wavebuf = create_bitmap_ex(8,288,224);
4948 clear_to_color(wavebuf,0);
4949 blit(framebuf,wavebuf,0,0,16,0,256,224);
4950
4951 static PALETTE wavepal;
4952
4953 //Breaks dark rooms.
4954 //In any case I don't think we need this, since palette is already loaded in doWarp() (famous last words...) -DD
4955 /*
4956 loadfullpal();
4957 loadlvlpal(DMaps[currdmap].color);
4958 ringcolor(false);
4959 */
4960 refreshpal=false;
4961 int32_t ofs;
4962 int32_t amplitude=8;
4963 int32_t wavelength=4;
4964 double palpos=168, palstep=4, palstop=126;
4965
4966 FFCore.runGenericPassiveEngine(SCR_TIMING_END_FRAME);
4967 for(int32_t i=0; i<168; i+=wavelength)
4968 {
4969 for(int32_t l=0; l<256; l++)
4970 {
4971 wavepal[l].r=vbound(int32_t(RAMpal[l].r+((palpos/palstop)*(63-RAMpal[l].r))),0,63);
4972 wavepal[l].g=vbound(int32_t(RAMpal[l].g+((palpos/palstop)*(63-RAMpal[l].g))),0,63);
4973 wavepal[l].b=vbound(int32_t(RAMpal[l].b+((palpos/palstop)*(63-RAMpal[l].b))),0,63);
4974 }
4975
4976 palpos-=palstep;
4977
4978 if(palpos>=0)
4979 {
4980 hw_palette = &wavepal;
4981 update_hw_pal = true;
4982 }
4983 else
4984 {
4985 hw_palette = &RAMpal;
4986 update_hw_pal = true;
4987 }
4988
4989 for(int32_t j=0; j+playing_field_offset<224; j++)
4990 {
4991 for(int32_t k=0; k<256; k++)
4992 {
4993 ofs=0;
4994
4995 if((j<(167-i))&&(j&1))
4996 {
4997 ofs=int32_t(zc::math::Sin((double(i+j)*2*PI/168.0))*amplitude);
4998 }
4999
5000 framebuf->line[j+playing_field_offset][k]=wavebuf->line[j+playing_field_offset][k+ofs+16];
5001 }
5002 }
5003
5004 syskeys();
5005 advanceframe(true);
5006 // animate_combos();
5007
5008 if(Quit)
5009 break;
5010 }
5011
5012 destroy_bitmap(wavebuf);
5013 }
5014
5015 743 void blackscr(int32_t fcnt,bool showsubscr)
5016 {
5017 743 reset_pal_cycling();
5018 743 script_drawing_commands.Clear();
5019
5020 743 FFCore.warpScriptCheck();
5021 743 bool showtime = game->should_show_time();
5022
2/2
✓ Branch 0 taken 743 times.
✓ Branch 1 taken 22262 times.
23005 while(fcnt>0)
5023 {
5024 22262 clear_bitmap(framebuf);
5025
5026
2/2
✓ Branch 0 taken 5610 times.
✓ Branch 1 taken 16652 times.
22262 if(showsubscr)
5027 {
5028 16652 put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,showtime,sspUP);
5029
3/4
✓ Branch 0 taken 16652 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 750 times.
✓ Branch 3 taken 15902 times.
16652 if(get_bit(quest_rules, qr_SCRIPTDRAWSINWARPS) || (get_bit(quest_rules, qr_PASSIVE_SUBSCRIPT_RUNS_WHEN_GAME_IS_FROZEN)))
5030 {
5031 750 do_script_draws(framebuf, tmpscr, 0, playing_field_offset);
5032 750 }
5033 16652 }
5034
5035 22262 syskeys();
5036 22262 advanceframe(true);
5037
5038
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22262 times.
22262 if(Quit)
5039 break;
5040
5041 22262 --fcnt;
5042 }
5043 743 }
5044
5045 214 void openscreen(int32_t shape)
5046 {
5047 214 reset_pal_cycling();
5048 214 black_opening_count=0;
5049
5050
3/4
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 98 times.
214 if(COOLSCROLL || shape>-1)
5051 {
5052 116 open_black_opening(HeroX()+8, (HeroY()-HeroZ()-HeroFakeZ())+8+playing_field_offset, true, shape);
5053 116 return;
5054 }
5055 else
5056 {
5057 98 Hero.setDontDraw(true);
5058 98 show_subscreen_dmap_dots=false;
5059 98 show_subscreen_numbers=false;
5060 // show_subscreen_items=false;
5061 98 show_subscreen_life=false;
5062 }
5063
5064 98 int32_t x=128;
5065
5066 98 FFCore.warpScriptCheck();
5067
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 7840 times.
7938 for(int32_t i=0; i<80; i++)
5068 {
5069 7840 draw_screen(tmpscr);
5070 //? draw_screen already draws the subscreen -DD
5071 //put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,false,sspUP);
5072 7840 x=128-(((i*128/80)/8)*8);
5073
5074
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7840 times.
7840 if(x>0)
5075 {
5076 7840 rectfill(framebuf,0,playing_field_offset,x,167+playing_field_offset,0);
5077 7840 rectfill(framebuf,256-x,playing_field_offset,255,167+playing_field_offset,0);
5078 7840 }
5079
5080 // x=((80-i)/2)*4;
5081 /*
5082 --x;
5083 switch(++c)
5084 {
5085 case 5: c=0;
5086 case 0:
5087 case 2:
5088 case 3: --x; break;
5089 }
5090 */
5091 7840 syskeys();
5092 7840 advanceframe(true);
5093
5094
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7840 times.
7840 if(Quit)
5095 {
5096 break;
5097 }
5098 7840 }
5099
5100 98 Hero.setDontDraw(false);
5101 98 show_subscreen_items=true;
5102 98 show_subscreen_dmap_dots=true;
5103 214 }
5104
5105 void closescreen(int32_t shape)
5106 {
5107 reset_pal_cycling();
5108 black_opening_count=0;
5109
5110 if(COOLSCROLL || shape>-1)
5111 {
5112 close_black_opening(HeroX()+8, (HeroY()-HeroZ()-HeroFakeZ())+8+playing_field_offset, true, shape);
5113 return;
5114 }
5115 else
5116 {
5117 Hero.setDontDraw(true);
5118 show_subscreen_dmap_dots=false;
5119 show_subscreen_numbers=false;
5120 // show_subscreen_items=false;
5121 show_subscreen_life=false;
5122 }
5123
5124 int32_t x=128;
5125
5126 FFCore.warpScriptCheck();
5127 for(int32_t i=79; i>=0; --i)
5128 {
5129 draw_screen(tmpscr);
5130 //? draw_screen already draws the subscreen -DD
5131 //put_passive_subscr(framebuf,&QMisc,0,passive_subscreen_offset,false,sspUP);
5132 x=128-(((i*128/80)/8)*8);
5133
5134 if(x>0)
5135 {
5136 rectfill(framebuf,0,playing_field_offset,x,167+playing_field_offset,0);
5137 rectfill(framebuf,256-x,playing_field_offset,255,167+playing_field_offset,0);
5138 }
5139
5140 // x=((80-i)/2)*4;
5141 /*
5142 --x;
5143 switch(++c)
5144 {
5145 case 5: c=0;
5146 case 0:
5147 case 2:
5148 case 3: --x; break;
5149 }
5150 */
5151 syskeys();
5152 advanceframe(true);
5153
5154 if(Quit)
5155 {
5156 break;
5157 }
5158 }
5159
5160 Hero.setDontDraw(false);
5161 show_subscreen_items=true;
5162 show_subscreen_dmap_dots=true;
5163 }
5164
5165 55 int32_t TriforceCount()
5166 {
5167 55 int32_t c=0;
5168
5169
2/2
✓ Branch 0 taken 440 times.
✓ Branch 1 taken 55 times.
495 for(int32_t i=1; i<=8; i++)
5170
2/2
✓ Branch 0 taken 227 times.
✓ Branch 1 taken 213 times.
653 if(game->lvlitems[i]&liTRIFORCE)
5171 213 ++c;
5172
5173 55 return c;
5174 }
5175
5176 int32_t onCustomGame()
5177 {
5178 int32_t file = getsaveslot();
5179
5180 if(file < 0)
5181 return D_O_K;
5182
5183 bool ret = (custom_game(file)!=0);
5184 return ret ? D_CLOSE : D_O_K;
5185 }
5186
5187 int32_t onContinue()
5188 {
5189 return D_CLOSE;
5190 }
5191
5192 int32_t onEsc() // Unused?? -L
5193 {
5194 return zc_getrawkey(KEY_ESC, true)?D_CLOSE:D_O_K;
5195 }
5196
5197 int32_t onVsync()
5198 {
5199 Throttlefps = !Throttlefps;
5200 zc_set_config(cfg_sect,"throttlefps", (int32_t)Throttlefps);
5201 return D_O_K;
5202 }
5203
5204 int32_t onWinPosSave()
5205 {
5206 SaveWinPos = !SaveWinPos;
5207 zc_set_config(cfg_sect,"save_window_position",(int32_t)SaveWinPos);
5208 return D_O_K;
5209 }
5210
5211 int32_t onClickToFreeze()
5212 {
5213 ClickToFreeze = !ClickToFreeze;
5214 zc_set_config(cfg_sect,"clicktofreeze", (int32_t)ClickToFreeze);
5215 return D_O_K;
5216 }
5217
5218 int32_t OnSaveZCConfig()
5219 {
5220 if(jwin_alert3(
5221 "Save Configuration",
5222 "Are you sure that you wish to save your present configuration settings?",
5223 "This will overwrite your prior settings!",
5224 NULL,
5225 "&Yes",
5226 "&No",
5227 NULL,
5228 'y',
5229 'n',
5230 0,
5231 lfont) == 1)
5232 {
5233 save_game_configs();
5234 return D_O_K;
5235 }
5236 else return D_O_K;
5237 }
5238
5239 int32_t OnnClearQuestDir()
5240 {
5241 if(jwin_alert3(
5242 "Clear Current Directory Cache",
5243 "Are you sure that you wish to clear the current cached directory?",
5244 "This will default the current directory to the ROOT for this instance of ZC Player!",
5245 NULL,
5246 "&Yes",
5247 "&No",
5248 NULL,
5249 'y',
5250 'n',
5251 0,
5252 lfont) == 1)
5253 {
5254 zc_set_config("zeldadx","win_qst_dir","");
5255 flush_config_file();
5256 strcpy(qstdir,"");
5257 #ifdef __EMSCRIPTEN__
5258 em_sync_fs();
5259 #endif
5260 return D_O_K;
5261 }
5262 else return D_O_K;
5263 }
5264
5265
5266 int32_t onConsoleZASM()
5267 {
5268 if ( !zasm_debugger )
5269 {
5270 AlertDialog("WARNING: ZASM Debugger",
5271 "Enabling this will open the ZASM Debugger Console"
5272 "\nThis will likely grind ZC to a halt with lag."
5273 "\nTo make any use of this, it is suggested that you read"
5274 "\nthe documentation for 'void Breakpoint(char[] string);'"
5275 " in 'ZScript_Additions.txt'"
5276 "\nThis is not recommended for normal users,"
5277 " and is only intended for ZC developers,"
5278 "\nor quest developers coding directly in ZASM"
5279 "\nAre you sure that you wish to open the ZASM Debugger?",
5280 [&](bool ret,bool)
5281 {
5282 if(ret)
5283 {
5284 FFCore.ZASMPrint(true);
5285 }
5286 }).show();
5287 return D_O_K;
5288 }
5289 else
5290 {
5291 FFCore.ZASMPrint(false);
5292 return D_O_K;
5293 }
5294 }
5295
5296
5297 int32_t onConsoleZScript()
5298 {
5299 if ( !zscript_debugger )
5300 {
5301 AlertDialog("ZScript Debugger",
5302 "Enabling this will open the ZScript Debugger Console"
5303 "\nThis will display any messages logged by scripts,"
5304 " including script errors."
5305 "\nAre you sure that you wish to open the ZScript Debugger?",
5306 [&](bool ret,bool)
5307 {
5308 if(ret)
5309 {
5310 FFCore.ZScriptConsole(true);
5311 }
5312 }).show();
5313 return D_O_K;
5314 }
5315 else
5316 {
5317 FFCore.ZScriptConsole(false);
5318 return D_O_K;
5319 }
5320 }
5321
5322 int32_t onClrConsoleOnLoad()
5323 {
5324 clearConsoleOnLoad = !clearConsoleOnLoad;
5325 zc_set_config("CONSOLE","clear_console_on_load",clearConsoleOnLoad?1:0);
5326 return D_O_K;
5327 }
5328
5329
5330 int32_t onFrameSkip()
5331 {
5332 FrameSkip = !FrameSkip;
5333 return D_O_K;
5334 }
5335
5336 int32_t onSaveDragResize()
5337 {
5338 SaveDragResize = !SaveDragResize;
5339 zc_set_config(cfg_sect,"save_drag_resize",(int32_t)SaveDragResize);
5340 return D_O_K;
5341 }
5342
5343 int32_t onDragAspect()
5344 {
5345 DragAspect = !DragAspect;
5346 zc_set_config(cfg_sect,"drag_aspect",(int32_t)DragAspect);
5347 return D_O_K;
5348 }
5349
5350 int32_t onTransLayers()
5351 {
5352 TransLayers = !TransLayers;
5353 zc_set_config(cfg_sect,"translayers",(int32_t)TransLayers);
5354 return D_O_K;
5355 }
5356
5357 int32_t onNESquit()
5358 {
5359 NESquit = !NESquit;
5360 zc_set_config(cfg_sect,"fastquit",(int32_t)NESquit);
5361 return D_O_K;
5362 }
5363
5364 int32_t onVolKeys()
5365 {
5366 volkeys = !volkeys;
5367 zc_set_config(sfx_sect,"volkeys",(int32_t)volkeys);
5368 return D_O_K;
5369 }
5370
5371 int32_t onShowFPS()
5372 {
5373 ShowFPS = !ShowFPS;
5374 zc_set_config(cfg_sect,"showfps",(int32_t)ShowFPS);
5375 return D_O_K;
5376 }
5377
5378 260074950 bool is_Fkey(int32_t k)
5379 {
5380
2/2
✓ Branch 0 taken 26448300 times.
✓ Branch 1 taken 233626650 times.
260074950 switch(k)
5381 {
5382 case KEY_F1:
5383 case KEY_F2:
5384 case KEY_F3:
5385 case KEY_F4:
5386 case KEY_F5:
5387 case KEY_F6:
5388 case KEY_F7:
5389 case KEY_F8:
5390 case KEY_F9:
5391 case KEY_F10:
5392 case KEY_F11:
5393 case KEY_F12:
5394 26448300 return true;
5395 }
5396
5397 233626650 return false;
5398 260074950 }
5399
5400 void kb_getkey(DIALOG *d)
5401 {
5402 d->flags|=D_SELECTED;
5403
5404 scare_mouse();
5405 jwin_button_proc(MSG_DRAW,d,0);
5406 jwin_draw_win(gui_bmp, (gui_bmp->w-160)/2, (gui_bmp->h-48)/2, 160, 48, FR_WIN);
5407 // text_mode(vc(11));
5408 textout_centre_ex(gui_bmp, font, "Press a key", gui_bmp->w/2, gui_bmp->h/2 - 8, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5409 textout_centre_ex(gui_bmp, font, "ESC to cancel", gui_bmp->w/2, gui_bmp->h/2, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5410 unscare_mouse();
5411
5412 update_hw_screen(true);
5413
5414 clear_keybuf();
5415 int32_t k = next_press_key();
5416 clear_keybuf();
5417
5418 //shnarf
5419 //47=f1
5420 //59=esc
5421 if(k>0 && k<123 && !((k>46)&&(k<60)))
5422 *((int32_t*)d->dp3) = k;
5423
5424
5425 d->flags&=~D_SELECTED;
5426 }
5427
5428
5429 //Used by all keyboard key settings dialogues.
5430 void kb_clearjoystick(DIALOG *d)
5431 {
5432 d->flags|=D_SELECTED;
5433
5434 scare_mouse();
5435 jwin_button_proc(MSG_DRAW,d,0);
5436 jwin_draw_win(gui_bmp, (gui_bmp->w-160)/2, (gui_bmp->h-48)/2, 168, 48, FR_WIN);
5437 // text_mode(vc(11));
5438 textout_centre_ex(gui_bmp, font, "Press any key to clear", gui_bmp->w/2, gui_bmp->h/2 - 8, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5439 textout_centre_ex(gui_bmp, font, "ESC to cancel", gui_bmp->w/2, gui_bmp->h/2, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5440 unscare_mouse();
5441
5442 update_hw_screen(true);
5443
5444 clear_keybuf();
5445 int32_t k = next_press_key();
5446 clear_keybuf();
5447
5448 //shnarf
5449 //47=f1
5450 //59=esc
5451 // if(k>0 && k<123 && !((k>46)&&(k<60)))
5452 // *((int32_t*)d->dp3) = k;
5453 if ( k != 59 ) *((int32_t*)d->dp3) = 0;
5454
5455
5456 d->flags&=~D_SELECTED;
5457 }
5458
5459 //Clears key to 0.
5460 //Used by all keyboard key settings dialogues.
5461 void kb_clearkey(DIALOG *d)
5462 {
5463 d->flags|=D_SELECTED;
5464
5465 scare_mouse();
5466 jwin_button_proc(MSG_DRAW,d,0);
5467 jwin_draw_win(gui_bmp, (gui_bmp->w-160)/2, (gui_bmp->h-48)/2, 160, 48, FR_WIN);
5468 // text_mode(vc(11));
5469 textout_centre_ex(gui_bmp, font, "Press any key to clear", gui_bmp->w/2, gui_bmp->h/2 - 8, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5470 textout_centre_ex(gui_bmp, font, "ESC to cancel", gui_bmp->w/2, gui_bmp->h/2, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5471 unscare_mouse();
5472
5473 update_hw_screen(true);
5474
5475 clear_keybuf();
5476 int32_t k = next_press_key();
5477 clear_keybuf();
5478
5479 //shnarf
5480 //47=f1
5481 //59=esc
5482 // if(k>0 && k<123 && !((k>46)&&(k<60)))
5483 // *((int32_t*)d->dp3) = k;
5484 if ( k != 59 ) *((int32_t*)d->dp3) = 0;
5485
5486
5487 d->flags&=~D_SELECTED;
5488 }
5489
5490
5491 int32_t d_j_clearbutton_proc(int32_t msg,DIALOG *d,int32_t c)
5492 {
5493 switch(msg)
5494 {
5495 case MSG_KEY:
5496 case MSG_CLICK:
5497
5498 kb_clearjoystick(d);
5499
5500 while(gui_mouse_b())
5501 {
5502 clear_keybuf();
5503 rest(1);
5504 }
5505
5506 return D_REDRAW;
5507 }
5508
5509 return jwin_button_proc(msg,d,c);
5510 }
5511
5512 int32_t d_kbutton_proc(int32_t msg,DIALOG *d,int32_t c)
5513 {
5514 switch(msg)
5515 {
5516 case MSG_KEY:
5517 case MSG_CLICK:
5518
5519 kb_getkey(d);
5520
5521 while(gui_mouse_b()) {
5522 clear_keybuf();
5523 rest(1);
5524 }
5525
5526 return D_REDRAW;
5527 }
5528
5529 return jwin_button_proc(msg,d,c);
5530 }
5531
5532 //Only used in keyboard settings dialogues to clear keys.
5533 int32_t d_k_clearbutton_proc(int32_t msg,DIALOG *d,int32_t c)
5534 {
5535 switch(msg)
5536 {
5537 case MSG_KEY:
5538 case MSG_CLICK:
5539
5540 kb_clearkey(d);
5541
5542 while(gui_mouse_b()) {
5543 clear_keybuf();
5544 rest(1);
5545 }
5546
5547 return D_REDRAW;
5548 }
5549
5550 return jwin_button_proc(msg,d,c);
5551 }
5552
5553 void j_getbtn(DIALOG *d)
5554 {
5555 d->flags|=D_SELECTED;
5556 scare_mouse();
5557 jwin_button_proc(MSG_DRAW,d,0);
5558 jwin_draw_win(gui_bmp, (gui_bmp->w-160)/2, (gui_bmp->h-48)/2, 160, 48, FR_WIN);
5559 // text_mode(vc(11));
5560 int32_t y = gui_bmp->h/2 - 12;
5561 textout_centre_ex(gui_bmp, font, "Press a button", gui_bmp->w/2, y, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5562 textout_centre_ex(gui_bmp, font, "ESC to cancel", gui_bmp->w/2, y+8, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5563 textout_centre_ex(gui_bmp, font, "SPACE to disable", gui_bmp->w/2, y+16, jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5564 unscare_mouse();
5565
5566 update_hw_screen(true);
5567
5568 int32_t b = next_press_btn();
5569
5570 if(b>=0)
5571 *((int32_t*)d->dp3) = b;
5572
5573 d->flags&=~D_SELECTED;
5574
5575 if (player)
5576 player->joy_on = TRUE;
5577 }
5578
5579 int32_t d_jbutton_proc(int32_t msg,DIALOG *d,int32_t c)
5580 {
5581 switch(msg)
5582 {
5583 case MSG_KEY:
5584 case MSG_CLICK:
5585
5586 j_getbtn(d);
5587
5588 while(gui_mouse_b()) {
5589 rest(1);
5590 clear_keybuf();
5591 }
5592
5593 return D_REDRAW;
5594 }
5595
5596 return jwin_button_proc(msg,d,c);
5597 }
5598
5599 //shnarf
5600 const char *key_str[] =
5601 {
5602 "(none) ", "a ", "b ", "c ",
5603 "d ", "e ", "f ", "g ",
5604 "h ", "i ", "j ", "k ",
5605 "l ", "m ", "n ", "o ",
5606 "p ", "q ", "r ", "s ",
5607 "t ", "u ", "v ", "w ",
5608 "x ", "y ", "z ", "0 ",
5609 "1 ", "2 ", "3 ", "4 ",
5610 "5 ", "6 ", "7 ", "8 ",
5611 "9 ", "num 0 ", "num 1 ", "num 2 ",
5612 "num 3 ", "num 4 ", "num 5 ", "num 6 ",
5613 "num 7 ", "num 8 ", "num 9 ", "f1 ",
5614 "f2 ", "f3 ", "f4 ", "f5 ",
5615 "f6 ", "f7 ", "f8 ", "f9 ",
5616 "f10 ", "f11 ", "f12 ", "esc ",
5617 "~ ", "- ", "= ", "backspace ",
5618 "tab ", "{ ", "} ", "enter ",
5619 ": ", "quote ", "\\ ", "\\ (2) ",
5620 ", ", ". ", "/ ", "space ",
5621 "insert ", "delete ", "home ", "end ",
5622 "page up ", "page down ", "left ", "right ",
5623 "up ", "down ", "num / ", "num * ",
5624 "num - ", "num + ", "num delete ", "num enter ",
5625 "print screen ", "pause ", "abnt c1 ", "yen ",
5626 "kana ", "convert ", "no convert ", "at ",
5627 "circumflex ", ": (2) ", "kanji ", "num = ",
5628 "back quote ", "; ", "command ", "unknown (0) ",
5629 "unknown (1) ", "unknown (2) ", "unknown (3) ", "unknown (4) ",
5630 "unknown (5) ", "unknown (6) ", "unknown (7) ", "left shift ",
5631 "right shift ", "left control ", "right control", "alt ",
5632 "alt gr ", "left win ", "right win ", "menu ",
5633 "scroll lock ", "number lock ", "caps lock ", "MAX"
5634 };
5635
5636
5637 const char *pan_str[4] = { "MONO", " 1/2", " 3/4", "FULL" };
5638 //extern int32_t zcmusic_bufsz;
5639
5640 static char str_a[80],str_b[80],str_s[80],str_m[80],str_l[80],str_r[80],str_p[80],str_ex1[80],str_ex2[80],str_ex3[80],str_ex4[80],
5641 str_leftmod1[80],str_leftmod2[80],str_rightmod1[80],str_rightmod2[80], str_left[80], str_right[80], str_up[80], str_down[80];
5642
5643 int32_t d_stringloader(int32_t msg,DIALOG *d,int32_t c)
5644 {
5645 //these are here to bypass compiler warnings about unused arguments
5646 c=c;
5647
5648 if(msg==MSG_DRAW)
5649 {
5650 switch(d->w)
5651 {
5652 case 0:
5653 sprintf(str_a,"%03d\n%s",Akey,key_str[Akey]);
5654 sprintf(str_b,"%03d\n%s",Bkey,key_str[Bkey]);
5655 sprintf(str_s,"%03d\n%s",Skey,key_str[Skey]);
5656 sprintf(str_l,"%03d\n%s",Lkey,key_str[Lkey]);
5657 sprintf(str_r,"%03d\n%s",Rkey,key_str[Rkey]);
5658 sprintf(str_p,"%03d\n%s",Pkey,key_str[Pkey]);
5659 sprintf(str_ex1,"%03d\n%s",Exkey1,key_str[Exkey1]);
5660 sprintf(str_ex2,"%03d\n%s",Exkey2,key_str[Exkey2]);
5661 sprintf(str_ex3,"%03d\n%s",Exkey3,key_str[Exkey3]);
5662 sprintf(str_ex4,"%03d\n%s",Exkey4,key_str[Exkey4]);
5663 sprintf(str_up,"%03d\n%s",DUkey,key_str[DUkey]);
5664 sprintf(str_down,"%03d\n%s",DDkey,key_str[DDkey]);
5665 sprintf(str_left,"%03d\n%s",DLkey,key_str[DLkey]);
5666 sprintf(str_right,"%03d\n%s",DRkey,key_str[DRkey]);
5667 sprintf(str_leftmod1,"%03d\n%s",cheat_modifier_keys[0],key_str[cheat_modifier_keys[0]]);
5668 sprintf(str_leftmod2,"%03d\n%s",cheat_modifier_keys[1],key_str[cheat_modifier_keys[1]]);
5669 sprintf(str_rightmod1,"%03d\n%s",cheat_modifier_keys[2],key_str[cheat_modifier_keys[2]]);
5670 sprintf(str_rightmod2,"%03d\n%s",cheat_modifier_keys[3],key_str[cheat_modifier_keys[3]]);
5671 break;
5672
5673 case 1:
5674 sprintf(str_a,"%03d\n%s",Abtn,joybtn_name(Abtn));
5675 sprintf(str_b,"%03d\n%s",Bbtn,joybtn_name(Bbtn));
5676 sprintf(str_s,"%03d\n%s",Sbtn,joybtn_name(Sbtn));
5677 sprintf(str_l,"%03d\n%s",Lbtn,joybtn_name(Lbtn));
5678 sprintf(str_r,"%03d\n%s",Rbtn,joybtn_name(Rbtn));
5679 sprintf(str_m,"%03d\n%s",Mbtn,joybtn_name(Mbtn));
5680 sprintf(str_p,"%03d\n%s",Pbtn,joybtn_name(Pbtn));
5681 sprintf(str_ex1,"%03d\n%s",Exbtn1,joybtn_name(Exbtn1));
5682 sprintf(str_ex2,"%03d\n%s",Exbtn2,joybtn_name(Exbtn2));
5683 sprintf(str_ex3,"%03d\n%s",Exbtn3,joybtn_name(Exbtn3));
5684 sprintf(str_ex4,"%03d\n%s",Exbtn4,joybtn_name(Exbtn4));
5685 sprintf(str_up,"%03d\n%s",DUbtn,joybtn_name(DUbtn));
5686 sprintf(str_down,"%03d\n%s",DDbtn,joybtn_name(DDbtn));
5687 sprintf(str_left,"%03d\n%s",DLbtn,joybtn_name(DLbtn));
5688 sprintf(str_right,"%03d\n%s",DRbtn,joybtn_name(DRbtn));
5689 sprintf(str_leftmod1,"%03d\n%s",cheat_modifier_keys[0],key_str[cheat_modifier_keys[0]]);
5690 sprintf(str_leftmod2,"%03d\n%s",cheat_modifier_keys[1],key_str[cheat_modifier_keys[1]]);
5691 sprintf(str_rightmod1,"%03d\n%s",cheat_modifier_keys[2],key_str[cheat_modifier_keys[2]]);
5692 sprintf(str_rightmod2,"%03d\n%s",cheat_modifier_keys[3],key_str[cheat_modifier_keys[3]]);
5693 break;
5694
5695 case 2:
5696 sprintf(str_a," %3d",midi_volume);
5697 sprintf(str_b," %3d",digi_volume);
5698 sprintf(str_l," %3d",emusic_volume);
5699 sprintf(str_m," %3dKB",zcmusic_bufsz);
5700 sprintf(str_r," %3d",sfx_volume);
5701 strcpy(str_s,pan_str[pan_style]);
5702 sprintf(str_leftmod1,"%3d\n%s",cheat_modifier_keys[0],key_str[cheat_modifier_keys[0]]);
5703 sprintf(str_leftmod2,"%3d\n%s",cheat_modifier_keys[1],key_str[cheat_modifier_keys[1]]);
5704 sprintf(str_rightmod1,"%3d\n%s",cheat_modifier_keys[2],key_str[cheat_modifier_keys[2]]);
5705 sprintf(str_rightmod2,"%3d\n%s",cheat_modifier_keys[3],key_str[cheat_modifier_keys[3]]);
5706 break;
5707 }
5708 }
5709
5710 return D_O_K;
5711 }
5712
5713 int32_t set_vol(void *dp3, int32_t d2)
5714 {
5715 switch(((int32_t*)dp3)[0])
5716 {
5717 case 0:
5718 midi_volume = zc_min(d2<<3,255);
5719 break;
5720
5721 case 1:
5722 digi_volume = zc_min(d2<<3,255);
5723 break;
5724
5725 case 2:
5726 emusic_volume = zc_min(d2<<3,255);
5727 break;
5728
5729 case 3:
5730 sfx_volume = zc_min(d2<<3,255);
5731 break;
5732 }
5733
5734 scare_mouse();
5735 // text_mode(vc(11));
5736 textprintf_right_ex(screen,is_large ? lfont_l : font, ((int32_t*)dp3)[1],((int32_t*)dp3)[2],jwin_pal[jcBOXFG],jwin_pal[jcBOX],"%3d",zc_min(d2<<3,255));
5737 unscare_mouse();
5738 return D_O_K;
5739 }
5740
5741 int32_t set_pan(void *dp3, int32_t d2)
5742 {
5743 pan_style = vbound(d2,0,3);
5744 scare_mouse();
5745 // text_mode(vc(11));
5746 textout_right_ex(screen,is_large ? lfont_l : font, pan_str[pan_style],((int32_t*)dp3)[1],((int32_t*)dp3)[2],jwin_pal[jcBOXFG],jwin_pal[jcBOX]);
5747 unscare_mouse();
5748 return D_O_K;
5749 }
5750
5751 int32_t set_buf(void *dp3, int32_t d2)
5752 {
5753 scare_mouse();
5754 // text_mode(vc(11));
5755 zcmusic_bufsz = d2 + 1;
5756 textprintf_right_ex(screen,is_large ? lfont_l : font, ((int32_t*)dp3)[1],((int32_t*)dp3)[2],jwin_pal[jcBOXFG],jwin_pal[jcBOX],"%3dKB",zcmusic_bufsz);
5757 unscare_mouse();
5758 return D_O_K;
5759 }
5760
5761 static int32_t gamepad_btn_list[] =
5762 {
5763 6,
5764 7,8,9,10,11,12,13,14,15,16,17,
5765 18,19,20,21,22,23,24,25,26,27,28,
5766 29,30,31,32,33,34,35,36,37,38,39,
5767 -1
5768 };
5769
5770 static int32_t gamepad_dirs_list[] =
5771 {
5772 40,41,42,43,
5773 44,45,46,47,
5774 48,49,50,51,
5775 52,53,54,55,
5776 56,
5777 -1
5778 };
5779
5780 static TABPANEL gamepad_tabs[] =
5781 {
5782 // (text)
5783 { (char *)"Buttons", D_SELECTED, gamepad_btn_list, 0, NULL },
5784 { (char *)"Directions", 0, gamepad_dirs_list, 0, NULL },
5785 { NULL, 0, NULL, 0, NULL }
5786 };
5787
5788 static DIALOG gamepad_dlg[] =
5789 {
5790 // (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3)
5791 { jwin_win_proc, 8, 24, 304, 256, 0, 0, 0, D_EXIT, 0, 0, (void *) "Gamepad Controls", NULL, NULL },
5792 { jwin_tab_proc, 8+4, 24+23,304-8,256-52,vc(0), vc(15), 0, 0, 0, 0, (void *) gamepad_tabs, NULL, (void *)gamepad_dlg },
5793 { d_stringloader, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
5794 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
5795 { jwin_button_proc, 90, 254, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
5796 { jwin_button_proc, 170, 254, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
5797 // 6
5798 { d_dummy_proc, 14, 61, 294, 192, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5799 // 7
5800 { jwin_ctext_proc, 92, 92-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_a, NULL, NULL },
5801 { jwin_ctext_proc, 92, 120-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_b, NULL, NULL },
5802 { jwin_ctext_proc, 92, 148-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_s, NULL, NULL },
5803 { jwin_ctext_proc, 92, 180-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex1, NULL, NULL },
5804 { jwin_ctext_proc, 92, 212-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex3, NULL, NULL },
5805 { jwin_ctext_proc, 237, 92-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_l, NULL, NULL },
5806 { jwin_ctext_proc, 237, 120-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_r, NULL, NULL },
5807 { jwin_ctext_proc, 237, 148-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_p, NULL, NULL },
5808 { jwin_ctext_proc, 237, 180-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex2, NULL, NULL },
5809 { jwin_ctext_proc, 237, 212-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex4, NULL, NULL },
5810 { jwin_ctext_proc, 92, 244-20, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_m, NULL, NULL },
5811 // 18
5812 { d_jbutton_proc, 22, 90-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "A", NULL, &Abtn},
5813 { d_jbutton_proc, 22, 118-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "B", NULL, &Bbtn},
5814 { d_jbutton_proc, 22, 146-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Start", NULL, &Sbtn},
5815 { d_jbutton_proc, 22, 178-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "X (EX1)", NULL, &Exbtn1},
5816 { d_jbutton_proc, 22, 210-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "EX3", NULL, &Exbtn3},
5817 { d_jbutton_proc, 167, 90-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "L", NULL, &Lbtn},
5818 { d_jbutton_proc, 167, 118-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "R", NULL, &Rbtn},
5819 { d_jbutton_proc, 167, 146-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Map", NULL, &Pbtn},
5820 { d_jbutton_proc, 167, 178-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Y (EX2)", NULL, &Exbtn2},
5821 { d_jbutton_proc, 167, 210-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "EX4", NULL, &Exbtn4},
5822 { d_jbutton_proc, 22, 242-20, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Menu", NULL, &Mbtn},
5823 // 29
5824 { d_j_clearbutton_proc, 22+91, 90-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Abtn},
5825 { d_j_clearbutton_proc, 22+91, 118-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Bbtn},
5826 { d_j_clearbutton_proc, 22+91, 146-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Sbtn},
5827 { d_j_clearbutton_proc, 22+91, 178-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exbtn1},
5828 { d_j_clearbutton_proc, 22+91, 210-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exbtn3},
5829 { d_j_clearbutton_proc, 167+91, 90-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Lbtn},
5830 { d_j_clearbutton_proc, 167+91, 118-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Rbtn},
5831 { d_j_clearbutton_proc, 167+91, 146-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Pbtn},
5832 { d_j_clearbutton_proc, 167+91, 178-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exbtn2},
5833 { d_j_clearbutton_proc, 167+91, 210-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exbtn4},
5834 { d_j_clearbutton_proc, 22+91, 242-20, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Mbtn},
5835 // 40
5836 { jwin_frame_proc, 14, 62, 147, 80, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5837 { jwin_frame_proc, 159, 62, 147, 80, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5838 { jwin_text_proc, 30, 68, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Vertical", NULL, NULL },
5839 { jwin_text_proc, 175, 68, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Horizontal", NULL, NULL },
5840 // 44
5841 { jwin_text_proc, 92, 84, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_up, NULL, NULL },
5842 { jwin_text_proc, 92, 112, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_down, NULL, NULL },
5843 { jwin_text_proc, 237, 84, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_left, NULL, NULL },
5844 { jwin_text_proc, 237, 112, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_right, NULL, NULL },
5845 // 48
5846 { d_jbutton_proc, 22, 82, 61, 21, vc(14), vc(11), 0, 0, 0, 0, (void *) "Up", NULL, &DUbtn },
5847 { d_jbutton_proc, 22, 110, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Down", NULL, &DDbtn },
5848 { d_jbutton_proc, 167, 82, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Left", NULL, &DLbtn },
5849 { d_jbutton_proc, 167, 110, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Right", NULL, &DRbtn },
5850 // 52
5851 { d_j_clearbutton_proc, 22+91, 82, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DUbtn},
5852 { d_j_clearbutton_proc, 22+91, 110, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DDbtn},
5853 { d_j_clearbutton_proc, 167+91, 82, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DLbtn},
5854 { d_j_clearbutton_proc, 167+91, 110, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DRbtn},
5855 // 56
5856 { jwin_check_proc, 22, 150, 147, 8, vc(14), vc(1), 0, 0, 1, 0, (void *) "Use Analog Stick/DPad", NULL, NULL },
5857 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
5858 };
5859
5860 static int32_t keyboard_keys_list[] =
5861 {
5862 6,7,8,9,10,
5863 11,12,13,14,15,16,17,18,19,20,
5864 21,22,23,24,25,26,27,28,29,30,
5865 31,32,33,34,35,36,37,38,39,40,
5866 -1
5867 };
5868
5869 static int32_t keyboard_dirs_list[] =
5870 {
5871 41,42,43,44,
5872 45,46,47,48,
5873 49,50,51,52,
5874 53,54,55,56,
5875 -1
5876 };
5877
5878 static int32_t keyboard_mods_list[] =
5879 {
5880 57,58,59,60,
5881 61,62,63,64,
5882 65,66,67,68,
5883 69,70,71,72,
5884 -1
5885 };
5886
5887 static TABPANEL keyboard_control_tabs[] =
5888 {
5889 // (text)
5890 { (char *)"Keys", D_SELECTED, keyboard_keys_list, 0, NULL },
5891 { (char *)"Directions", 0, keyboard_dirs_list, 0, NULL },
5892 { (char *)"Cheat Mods", 0, keyboard_mods_list, 0, NULL },
5893 { NULL, 0, NULL, 0, NULL }
5894 };
5895
5896 static DIALOG keyboard_control_dlg[] =
5897 {
5898 // (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3)
5899 { jwin_win_proc, 8, 39, 304, 240, 0, 0, 0, D_EXIT, 0, 0, (void *) "Keyboard Controls", NULL, NULL },
5900 { jwin_tab_proc, 8+4, 39+23,304-8,240-56,vc(0), vc(15), 0, 0, 0, 0, (void *) keyboard_control_tabs, NULL, (void *)keyboard_control_dlg },
5901 { d_stringloader, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
5902 { jwin_button_proc, 90, 254, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
5903 { jwin_button_proc, 170, 254, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
5904 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
5905 // Keys
5906 // 6
5907 { jwin_frame_proc, 14, 80, 148, 105, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5908 { jwin_frame_proc, 158, 80, 148, 105, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5909 { jwin_frame_proc, 14, 181, 292, 67, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5910 { jwin_text_proc, 30, 86, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Standard", NULL, NULL },
5911 { jwin_text_proc, 175, 86, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Extended", NULL, NULL },
5912 // 11
5913 { jwin_text_proc, 92-4, 102, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_a, NULL, NULL },
5914 { jwin_text_proc, 92-4, 130, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_b, NULL, NULL },
5915 { jwin_text_proc, 92-4, 158, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_s, NULL, NULL },
5916 { jwin_text_proc, 92-4, 190, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex1, NULL, NULL },
5917 { jwin_text_proc, 92-4, 222, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex3, NULL, NULL },
5918 { jwin_text_proc, 237-4, 102, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_l, NULL, NULL },
5919 { jwin_text_proc, 237-4, 130, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_r, NULL, NULL },
5920 { jwin_text_proc, 237-4, 158, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_p, NULL, NULL },
5921 { jwin_text_proc, 237-4, 190, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex2, NULL, NULL },
5922 { jwin_text_proc, 237-4, 222, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_ex4, NULL, NULL },
5923 // 21
5924 { d_kbutton_proc, 22, 100, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "A", NULL, &Akey},
5925 { d_kbutton_proc, 22, 128, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "B", NULL, &Bkey},
5926 { d_kbutton_proc, 22, 156, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Start", NULL, &Skey},
5927 { d_kbutton_proc, 22, 188, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "X (EX1)", NULL, &Exkey1},
5928 { d_kbutton_proc, 22, 220, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "EX3", NULL, &Exkey3},
5929 { d_kbutton_proc, 167, 100, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "L", NULL, &Lkey},
5930 { d_kbutton_proc, 167, 128, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "R", NULL, &Rkey},
5931 { d_kbutton_proc, 167, 156, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Map", NULL, &Pkey},
5932 { d_kbutton_proc, 167, 188, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Y (EX2)", NULL, &Exkey2},
5933 { d_kbutton_proc, 167, 220, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "EX4", NULL, &Exkey4},
5934 // 31
5935 { d_k_clearbutton_proc, 22+91, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Akey},
5936 { d_k_clearbutton_proc, 22+91, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Bkey},
5937 { d_k_clearbutton_proc, 22+91, 156, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Skey},
5938 { d_k_clearbutton_proc, 22+91, 188, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exkey1},
5939 { d_k_clearbutton_proc, 22+91, 220, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exkey3},
5940 { d_k_clearbutton_proc, 167+91, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Lkey},
5941 { d_k_clearbutton_proc, 167+91, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Rkey},
5942 { d_k_clearbutton_proc, 167+91, 156, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Pkey},
5943 { d_k_clearbutton_proc, 167+91, 188, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exkey2},
5944 { d_k_clearbutton_proc, 167+91, 220, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &Exkey4},
5945 // Dirs
5946 // 41
5947 { jwin_frame_proc, 14, 80, 147, 80, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5948 { jwin_frame_proc, 159, 80, 147, 80, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5949 { jwin_text_proc, 30, 86, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Vertical", NULL, NULL },
5950 { jwin_text_proc, 175, 86, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Horizontal", NULL, NULL },
5951 // 45
5952 { jwin_text_proc, 92-4, 102, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_up, NULL, NULL },
5953 { jwin_text_proc, 92-4, 130, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_down, NULL, NULL },
5954 { jwin_text_proc, 237-4, 102, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_left, NULL, NULL },
5955 { jwin_text_proc, 237-4, 130, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_right, NULL, NULL },
5956 // 49
5957 { d_kbutton_proc, 22, 100, 61, 21, vc(14), vc(11), 0, 0, 0, 0, (void *) "Up", NULL, &DUkey},
5958 { d_kbutton_proc, 22, 128, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Down", NULL, &DDkey},
5959 { d_kbutton_proc, 167, 100, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Left", NULL, &DLkey},
5960 { d_kbutton_proc, 167, 128, 61, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Right", NULL, &DRkey},
5961 // 53
5962 { d_k_clearbutton_proc, 22+91, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DUkey},
5963 { d_k_clearbutton_proc, 22+91, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DDkey},
5964 { d_k_clearbutton_proc, 167+91, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DLkey},
5965 { d_k_clearbutton_proc, 167+91, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &DRkey},
5966 // Mods
5967 // 57
5968 { jwin_frame_proc, 14, 80, 148, 140-58, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5969 { jwin_frame_proc, 158, 80, 148, 140-58, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
5970 { jwin_text_proc, 30, 86, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Left", NULL, NULL },
5971 { jwin_text_proc, 175, 86, 160, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Right", NULL, NULL },
5972 // 61
5973 { jwin_text_proc, 92-26, 101, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_leftmod1, NULL, NULL },
5974 { jwin_text_proc, 92-26, 129, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_rightmod1, NULL, NULL },
5975 { jwin_text_proc, 237-4-22,101, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_leftmod2, NULL, NULL },
5976 { jwin_text_proc, 237-4-22,129, 60, 8, vc(7), vc(11), 0, 0, 0, 0, str_rightmod2, NULL, NULL },
5977 // 65
5978 { d_kbutton_proc, 22, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Main", NULL, &cheat_modifier_keys[0]},
5979 { d_kbutton_proc, 22, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Second", NULL, &cheat_modifier_keys[2]},
5980 { d_kbutton_proc, 167, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Main", NULL, &cheat_modifier_keys[1]},
5981 { d_kbutton_proc, 167, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Second", NULL, &cheat_modifier_keys[3]},
5982 // 69
5983 { d_k_clearbutton_proc, 22+91, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &cheat_modifier_keys[0]},
5984 { d_k_clearbutton_proc, 22+91, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &cheat_modifier_keys[2]},
5985 { d_k_clearbutton_proc, 167+91, 100, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &cheat_modifier_keys[1]},
5986 { d_k_clearbutton_proc, 167+91, 128, 40, 21, vc(14), vc(1), 0, 0, 0, 0, (void *) "Clear", NULL, &cheat_modifier_keys[3]},
5987 // 73
5988 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
5989 };
5990
5991 /*
5992 int32_t midi_dp[3] = {0,147,104};
5993 int32_t digi_dp[3] = {1,147,120};
5994 int32_t pan_dp[3] = {0,147,136};
5995 int32_t buf_dp[3] = {0,147,152};
5996 */
5997 int32_t midi_dp[3] = {0,0,0};
5998 int32_t digi_dp[3] = {1,0,0};
5999 int32_t emus_dp[3] = {2,0,0};
6000 int32_t buf_dp[3] = {0,0,0};
6001 int32_t sfx_dp[3] = {3,0,0};
6002 int32_t pan_dp[3] = {0,0,0};
6003
6004 static DIALOG sound_dlg[] =
6005 {
6006 //(dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3)
6007 13 { jwin_win_proc, 0, 0, 320, 178, 0, 0, 0, D_EXIT, 0, 0, (void *) "Sound Settings", NULL, NULL },
6008 13 { d_stringloader, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6009 13 { jwin_button_proc, 58, 148, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
6010 13 { jwin_button_proc, 138, 148, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
6011 13 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6012 13 { jwin_frame_proc, 10, 28, 300, 112, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6013 13 { jwin_rtext_proc, 190, 40, 40, 8, vc(7), vc(11), 0, 0, 0, 0, (void *) str_a, NULL, NULL },
6014 13 { jwin_rtext_proc, 190, 56, 40, 8, vc(7), vc(11), 0, 0, 0, 0, (void *) str_b, NULL, NULL },
6015 13 { jwin_rtext_proc, 190, 72, 40, 8, vc(7), vc(11), 0, 0, 0, 0, (void *) str_l, NULL, NULL },
6016 13 { jwin_rtext_proc, 190, 88, 40, 8, vc(7), vc(11), 0, 0, 0, 0, (void *) str_m, NULL, NULL },
6017 // 10
6018 13 { jwin_rtext_proc, 190, 104, 40, 8, vc(7), vc(11), 0, 0, 0, 0, (void *) str_r, NULL, NULL },
6019 13 { jwin_rtext_proc, 190, 120, 40, 8, vc(7), vc(11), 0, 0, 0, 0, (void *) str_s, NULL, NULL },
6020 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6021 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6022 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6023 13 { jwin_slider_proc, 196, 40, 96, 8, vc(0), jwin_pal[jcBOX], 0, 0, 32, 0, NULL, (void *) set_vol, midi_dp },
6024 13 { jwin_slider_proc, 196, 56, 96, 8, vc(0), jwin_pal[jcBOX], 0, 0, 32, 0, NULL, (void *) set_vol, digi_dp },
6025 13 { jwin_slider_proc, 196, 72, 96, 8, vc(0), jwin_pal[jcBOX], 0, 0, 32, 0, NULL, (void *) set_vol, emus_dp },
6026 13 { jwin_slider_proc, 196, 88, 96, 8, vc(0), jwin_pal[jcBOX], 0, 0, 127, 0, NULL, (void *) set_buf, buf_dp },
6027 13 { jwin_slider_proc, 196, 104, 96, 8, vc(0), jwin_pal[jcBOX], 0, 0, 32, 0, NULL, (void *) set_vol, sfx_dp },
6028 //20
6029 13 { jwin_slider_proc, 196, 120, 96, 8, vc(0), jwin_pal[jcBOX], 0, 0, 3, 0, NULL, (void *) set_pan, pan_dp },
6030 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6031 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6032 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6033 13 { jwin_text_proc, 17, 40, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Master MIDI Volume", NULL, NULL },
6034 13 { jwin_text_proc, 17, 56, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Master Digi Volume", NULL, NULL },
6035 13 { jwin_text_proc, 17, 72, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Enhanced Music Volume", NULL, NULL },
6036 13 { jwin_text_proc, 17, 88, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Enhanced Music Buffer", NULL, NULL },
6037 13 { jwin_text_proc, 17, 104, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "SFX Volume", NULL, NULL },
6038 13 { jwin_text_proc, 17, 120, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "SFX Pan", NULL, NULL },
6039 //30
6040 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6041 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6042 13 { d_dummy_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6043 13 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6044 };
6045
6046 char zc_builddate[80];
6047 char zc_aboutstr[80];
6048
6049 static DIALOG about_dlg[] =
6050 {
6051 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
6052 { jwin_win_proc, 68, 52, 184, 154, 0, 0, 0, D_EXIT, 0, 0, (void *) "About", NULL, NULL },
6053 { jwin_button_proc, 140, 176, 41, 21, vc(14), 0, 0, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
6054 { jwin_ctext_proc, 160, 84, 0, 8, vc(0), vc(11), 0, 0, 0, 0, zc_aboutstr, NULL, NULL },
6055 { jwin_ctext_proc, 160, 92, 0, 8, vc(0) , vc(11), 0, 0, 0, 0, str_s, NULL, NULL },
6056 { jwin_ctext_proc, 160, 100, 0, 8, vc(0) , vc(11), 0, 0, 0, 0, zc_builddate, NULL, NULL },
6057 { jwin_text_proc, 88, 124, 140, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Coded by:", NULL, NULL },
6058 { jwin_text_proc, 88, 132, 140, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) " Phantom Menace", NULL, NULL },
6059 { jwin_text_proc, 88, 144, 140, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Produced by:", NULL, NULL },
6060 { jwin_text_proc, 88, 152, 140, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) " Armageddon Games", NULL, NULL },
6061 { jwin_frame_proc, 80, 117, 160, 50, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
6062 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6063 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6064 };
6065
6066
6067 static DIALOG quest_dlg[] =
6068 {
6069 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
6070 { jwin_win_proc, 68, 25, 184, 190, 0, 0, 0, D_EXIT, 0, 0, (void *) "Quest Info", NULL, NULL },
6071 { jwin_edit_proc, 84, 54, 152, 16, 0, 0, 0, D_READONLY, 100, 0, NULL, NULL, NULL },
6072 { jwin_text_proc, 89, 84, 141, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Number:", NULL, NULL },
6073 { jwin_text_proc, 152, 84, 24, 8, vc(7), vc(11), 0, 0, 0, 0, str_a, NULL, NULL },
6074 { jwin_text_proc, 89, 94, 141, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Version:", NULL, NULL },
6075 { jwin_text_proc, 160, 94, 64, 8, vc(7), vc(11), 0, 0, 0, 0, header_version_nul_term, NULL, NULL },
6076 { jwin_text_proc, 89, 104, 141, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "ZQ Version:", NULL, NULL },
6077 { jwin_text_proc, 184, 104, 64, 8, vc(7), vc(11), 0, 0, 0, 0, str_s, NULL, NULL },
6078 { jwin_text_proc, 84, 126, 80, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Title:", NULL, NULL },
6079 { jwin_textbox_proc, 84, 136, 152, 24, 0, 0, 0, 0, 0, 0, QHeader.title, NULL, NULL },
6080 { jwin_text_proc, 84, 168, 80, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Author:", NULL, NULL },
6081 { jwin_textbox_proc, 84, 178, 152, 24, 0, 0, 0, 0, 0, 0, QHeader.author, NULL, NULL },
6082 { jwin_frame_proc, 84, 79, 152, 38, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
6083 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6084 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6085 };
6086
6087 static DIALOG triforce_dlg[] =
6088 {
6089 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) */
6090 { jwin_win_proc, 72, 64, 177, 105, vc(14), vc(1), 0, D_EXIT, 0, 0, (void *) "Triforce Pieces", NULL, NULL },
6091 // 1
6092 { jwin_check_proc, 129, 94, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "1", NULL, NULL },
6093 { jwin_check_proc, 129, 104, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "2", NULL, NULL },
6094 { jwin_check_proc, 129, 114, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "3", NULL, NULL },
6095 { jwin_check_proc, 129, 124, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "4", NULL, NULL },
6096 { jwin_check_proc, 172, 94, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "5", NULL, NULL },
6097 { jwin_check_proc, 172, 104, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "6", NULL, NULL },
6098 { jwin_check_proc, 172, 114, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "7", NULL, NULL },
6099 { jwin_check_proc, 172, 124, 24, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "8", NULL, NULL },
6100 // 9
6101 { jwin_button_proc, 90, 144, 61, 21, vc(0), vc(11), 'k', D_EXIT, 0, 0, (void *) "O&K", NULL, NULL },
6102 { jwin_button_proc, 170, 144, 61, 21, vc(0), vc(11), 27, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
6103 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6104 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6105 };
6106
6107 /*static DIALOG equip_dlg[] =
6108 {
6109 // (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp)
6110 { jwin_win_proc, 16, 18, 289, 215, vc(14), vc(1), 0, D_EXIT, 0, 0, (void *) "Equipment", NULL, NULL },
6111 // 1
6112 { jwin_button_proc, 90, 206, 61, 21, vc(0), vc(11), 'k', D_EXIT, 0, 0, (void *) "O&K", NULL, NULL },
6113 { jwin_button_proc, 170, 206, 61, 21, vc(0), vc(11), 27, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
6114 // 3
6115 { jwin_frame_proc, 25, 45, 77, 50, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6116 { jwin_text_proc, 29, 42, 40, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Sword", NULL, NULL },
6117 { jwin_check_proc, 33, 52, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Wooden", NULL, NULL },
6118 { jwin_check_proc, 33, 62, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "White", NULL, NULL },
6119 { jwin_check_proc, 33, 72, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Magic", NULL, NULL },
6120 { jwin_check_proc, 33, 82, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Master", NULL, NULL },
6121 // 9
6122 { jwin_frame_proc, 25, 99, 77, 40, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6123 { jwin_text_proc, 29, 96, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Shield", NULL, NULL },
6124 { jwin_check_proc, 33, 106, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Small", NULL, NULL },
6125 { jwin_check_proc, 33, 116, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Magic", NULL, NULL },
6126 { jwin_check_proc, 33, 126, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Mirror", NULL, NULL },
6127 // 14
6128 { jwin_frame_proc, 25, 143, 61, 40, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6129 { jwin_text_proc, 29, 140, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Ring", NULL, NULL },
6130 { jwin_check_proc, 33, 150, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Blue", NULL, NULL },
6131 { jwin_check_proc, 33, 160, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Red", NULL, NULL },
6132 { jwin_check_proc, 33, 170, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Gold", NULL, NULL },
6133 // 19
6134 { jwin_frame_proc, 110, 45, 85, 30, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6135 { jwin_text_proc, 114, 42, 64, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Bracelet", NULL, NULL },
6136 { jwin_check_proc, 118, 52, 72, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Level 1", NULL, NULL },
6137 { jwin_check_proc, 118, 62, 72, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Level 2", NULL, NULL },
6138 // 23
6139 { jwin_frame_proc, 110, 79, 85, 30, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6140 { jwin_text_proc, 114, 76, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Amulet", NULL, NULL },
6141 { jwin_check_proc, 118, 86, 72, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Level 1", NULL, NULL },
6142 { jwin_check_proc, 118, 96, 72, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Level 2", NULL, NULL },
6143 // 27
6144 { jwin_frame_proc, 110, 113, 69, 30, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6145 { jwin_text_proc, 114, 110, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Wallet", NULL, NULL },
6146 { jwin_check_proc, 118, 120, 56, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Small", NULL, NULL },
6147 { jwin_check_proc, 118, 130, 56, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Large", NULL, NULL },
6148 // 31
6149 { jwin_frame_proc, 110, 147, 69, 30, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6150 { jwin_text_proc, 114, 144, 24, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Bow", NULL, NULL },
6151 { jwin_check_proc, 118, 154, 56, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Small", NULL, NULL },
6152 { jwin_check_proc, 118, 164, 56, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Large", NULL, NULL },
6153 // 35
6154 { jwin_frame_proc, 203, 45, 93, 70, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6155 { jwin_text_proc, 207, 42, 40, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Other", NULL, NULL },
6156 { jwin_check_proc, 211, 52, 80, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Raft", NULL, NULL },
6157 { jwin_check_proc, 211, 62, 80, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Ladder", NULL, NULL },
6158 { jwin_check_proc, 211, 72, 80, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Book", NULL, NULL },
6159 { jwin_check_proc, 211, 82, 80, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Magic Key", NULL, NULL },
6160 { jwin_check_proc, 211, 92, 80, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Flippers", NULL, NULL },
6161 { jwin_check_proc, 211, 102, 80, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Boots", NULL, NULL },
6162 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6163 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6164 };
6165
6166 static DIALOG items_dlg[] =
6167 {
6168 // (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp)
6169 { jwin_win_proc, 16, 18, 289, 215, vc(14), vc(1), 0, D_EXIT, 0, 0, (void *) "Items", NULL, NULL },
6170 //1
6171 { jwin_button_proc, 90, 206, 61, 21, vc(0), vc(11), 'k', D_EXIT, 0, 0, (void *) "O&K", NULL, NULL },
6172 { jwin_button_proc, 170, 206, 61, 21, vc(0), vc(11), 27, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
6173 // 3
6174 { jwin_frame_proc, 27, 45, 77, 40, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6175 { jwin_text_proc, 31, 42, 64, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Boomerang", NULL, NULL },
6176 { jwin_check_proc, 35, 52, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Wooden", NULL, NULL },
6177 { jwin_check_proc, 35, 62, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Magic", NULL, NULL },
6178 { jwin_check_proc, 35, 72, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Fire", NULL, NULL },
6179 // 8
6180 { jwin_frame_proc, 27, 89, 77, 40, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6181 { jwin_text_proc, 31, 86, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Arrow", NULL, NULL },
6182 { jwin_check_proc, 35, 96, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Wooden", NULL, NULL },
6183 { jwin_check_proc, 35, 106, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Silver", NULL, NULL },
6184 { jwin_check_proc, 35, 116, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Golden", NULL, NULL },
6185 // 13
6186 { jwin_frame_proc, 27, 133, 63, 40, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6187 { jwin_text_proc, 31, 130, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Potion", NULL, NULL },
6188 { jwin_radio_proc, 35, 140, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "None", NULL, NULL },
6189 { jwin_radio_proc, 35, 150, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Blue", NULL, NULL },
6190 { jwin_radio_proc, 35, 160, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Red", NULL, NULL },
6191 // 18
6192 { jwin_frame_proc, 114, 45, 93, 20, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6193 { jwin_text_proc, 118, 42, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Whistle", NULL, NULL },
6194 { jwin_check_proc, 122, 52, 80, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Recorder", NULL, NULL },
6195 // 21
6196 { jwin_frame_proc, 114, 69, 86, 20, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6197 { jwin_text_proc, 118, 66, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Hammer", NULL, NULL },
6198 { jwin_check_proc, 122, 76, 72, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Level 1", NULL, NULL },
6199 // 24
6200 { jwin_frame_proc, 114, 93, 69, 30, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6201 { jwin_text_proc, 118, 90, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Hookshot", NULL, NULL },
6202 { jwin_check_proc, 122, 100, 56, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Short", NULL, NULL },
6203 { jwin_check_proc, 122, 110, 56, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Long", NULL, NULL },
6204 // 28
6205 { jwin_frame_proc, 114, 127, 60, 30, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6206 { jwin_text_proc, 118, 124, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Candle", NULL, NULL },
6207 { jwin_check_proc, 122, 134, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Blue", NULL, NULL },
6208 { jwin_check_proc, 122, 144, 48, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Red", NULL, NULL },
6209 // 32
6210 { jwin_frame_proc, 217, 45, 77, 138, 0, 0, 0, 0, FR_ETCHED, 0, NULL, NULL, NULL },
6211 { jwin_text_proc, 221, 42, 80, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Other", NULL, NULL },
6212 { jwin_check_proc, 225, 52, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Bait", NULL, NULL },
6213 { jwin_check_proc, 225, 62, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Letter", NULL, NULL },
6214 { jwin_check_proc, 225, 72, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Wand", NULL, NULL },
6215 { jwin_check_proc, 225, 82, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Lens", NULL, NULL },
6216 { jwin_check_proc, 225, 92, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Din's Fire", NULL, NULL },
6217 { jwin_check_proc, 225, 102, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Farore's Wind", NULL, NULL },
6218 { jwin_check_proc, 225, 112, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Nayru's Love", NULL, NULL },
6219 { jwin_text_proc, 225, 132, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "Bombs:", NULL, NULL },
6220 { jwin_edit_proc, 229, 142, 40, 16, 0, 0, 0, 0, 6, 0, NULL, NULL, NULL },
6221 { jwin_text_proc, 225, 162, 48, 9, vc(0), vc(11), 0, 0, 0, 0, (void *) "S-Bombs:", NULL, NULL },
6222 { jwin_edit_proc, 229, 162, 40, 16, 0, 0, 0, 0, 6, 0, NULL, NULL, NULL },
6223 { jwin_check_proc, 225, 122, 64, 9, vc(0), vc(11), 0, 0, 1, 0, (void *) "Cane of Byrna", NULL, NULL },
6224 //45
6225 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6226 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6227 };*/
6228
6229
6230
6231 bool zc_getname(const char *prompt,const char *ext,EXT_LIST *list,const char *def,bool usefilename)
6232 {
6233 go();
6234 int32_t ret=0;
6235 ret = zc_getname_nogo(prompt,ext,list,def,usefilename);
6236 comeback();
6237 return ret != 0;
6238 }
6239
6240
6241 bool zc_getname_nogo(const char *prompt,const char *ext,EXT_LIST *list,const char *def,bool usefilename)
6242 {
6243 if(def!=modulepath)
6244 strcpy(modulepath,def);
6245
6246 if(!usefilename)
6247 {
6248 int32_t i=(int32_t)strlen(modulepath);
6249
6250 while(i>=0 && modulepath[i]!='\\' && modulepath[i]!='/')
6251 modulepath[i--]=0;
6252 }
6253
6254 // int32_t ret = file_select_ex(prompt,modulepath,ext,255,-1,-1);
6255 int32_t ret=0;
6256 int32_t sel=0;
6257
6258 if(list==NULL)
6259 {
6260 ret = jwin_file_select_ex(prompt,modulepath,ext,2048,-1,-1,lfont);
6261 }
6262 else
6263 {
6264 ret = jwin_file_browse_ex(prompt, modulepath, list, &sel, 2048, -1, -1, lfont);
6265 }
6266
6267 return ret!=0;
6268 }
6269
6270 //The Dialogue that loads a ZMOD Module File
6271 int32_t zc_load_zmod_module_file()
6272 {
6273 if ( Playing )
6274 {
6275 jwin_alert("Error","Cannot change module while playing a quest!",NULL,NULL,"O&K",NULL,'k',0,lfont);
6276 return -1;
6277 }
6278 if(!zc_getname("Load Module (.zmod)","zmod",NULL,modulepath,false))
6279 return D_CLOSE;
6280
6281 FILE *tempmodule = fopen(modulepath,"r");
6282
6283 if(tempmodule == NULL)
6284 {
6285 jwin_alert("Error","Cannot open specified file!",NULL,NULL,"O&K",NULL,'k',0,lfont);
6286 return -1;
6287 }
6288
6289
6290 //Set the module path:
6291 memset(moduledata.module_name, 0, sizeof(moduledata.module_name));
6292 strcpy(moduledata.module_name, modulepath);
6293 al_trace("New Module Path is: %s \n", moduledata.module_name);
6294 zc_set_config("ZCMODULE","current_module",moduledata.module_name);
6295 zcm.init(true); //Load the module values.
6296 moduledata.refresh_title_screen = 1;
6297 // refresh_select_screen = 1;
6298 build_biic_list();
6299 return D_O_K;
6300 }
6301
6302 static DIALOG module_info_dlg[] =
6303 {
6304 // (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp)
6305
6306
6307 { jwin_win_proc, 0, 0, 200, 200, vc(14), vc(1), 0, D_EXIT, 0, 0, (void *) "About Current Module", NULL, NULL },
6308 //1
6309 { jwin_text_proc, 10, 20, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"Module:", NULL, NULL },
6310 //2
6311 { jwin_text_proc, 50, 20, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6312 { jwin_text_proc, 10, 30, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"Author:", NULL, NULL },
6313 //4
6314 { jwin_text_proc, 50, 30, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6315 { jwin_text_proc, 10, 40, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6316 { jwin_text_proc, 10, 50, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"Information:", NULL, NULL },
6317 //7
6318
6319 { jwin_text_proc, 10, 60, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6320 { jwin_text_proc, 10, 70, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6321 { jwin_text_proc, 10, 80, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6322 { jwin_text_proc, 10, 90, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6323 { jwin_text_proc, 10, 100, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6324 { jwin_text_proc, 10, 120, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6325 { jwin_text_proc, 10, 130, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6326 { jwin_text_proc, 10, 140, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6327 { jwin_text_proc, 10, 150, 20, 8, vc(11), vc(1), 0, 0, 0, 0, (void*)"", NULL, NULL },
6328
6329 { jwin_button_proc, 40, 160, 50, 21, vc(14), vc(1), 13, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
6330 { jwin_button_proc, 200-40-50, 160, 50, 21, vc(14), vc(1), 27, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
6331 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6332 };
6333
6334 void about_zcplayer_module(const char *prompt,int32_t initialval)
6335 {
6336
6337 module_info_dlg[0].dp2 = lfont;
6338 if ( moduledata.moduletitle[0] != 0 )
6339 module_info_dlg[2].dp = (char*)moduledata.moduletitle;
6340
6341 if ( moduledata.moduleauthor[0] != 0 )
6342 module_info_dlg[4].dp = (char*)moduledata.moduleauthor;
6343
6344 if ( moduledata.moduleinfo0[0] != 0 )
6345 module_info_dlg[7].dp = (char*)moduledata.moduleinfo0;
6346 if ( moduledata.moduleinfo1[0] != 0 )
6347 module_info_dlg[8].dp = (char*)moduledata.moduleinfo1;
6348 if ( moduledata.moduleinfo2[0] != 0 )
6349 module_info_dlg[9].dp = (char*)moduledata.moduleinfo2;
6350 if ( moduledata.moduleinfo3[0] != 0 )
6351 module_info_dlg[10].dp = (char*)moduledata.moduleinfo3;
6352 if ( moduledata.moduleinfo4[0] != 0 )
6353 module_info_dlg[11].dp = (char*)moduledata.moduleinfo4;
6354
6355 char module_date[255];
6356 memset(module_date, 0, sizeof(module_date));
6357 sprintf(module_date,"Build Date: %s %s, %d at @ %d:%d %s", dayextension(moduledata.modday).c_str(),
6358 (char*)months[moduledata.modmonth], moduledata.modyear, moduledata.modhour, moduledata.modminute, moduledata.moduletimezone);
6359
6360
6361
6362 char module_vers[255];
6363 memset(module_vers, 0, sizeof(module_vers));
6364 sprintf(module_vers, "Version: %d.%d.%d.%d", moduledata.modver_1, moduledata.modver_2, moduledata.modver_3, moduledata.modver_4);
6365
6366
6367 //sprintf(tilecount,"%d",1);
6368
6369 char module_build[255];
6370 memset(module_build, 0, sizeof(module_build));
6371 if ( moduledata.modbeta )
6372 sprintf(module_build,"Module Build: %d, %s: %d", moduledata.modbuild, (moduledata.modbeta<0) ? "Alpha" : "Beta", moduledata.modbeta );
6373 else
6374 sprintf(module_build,"Module Build: %d", moduledata.modbuild);
6375
6376 module_info_dlg[12].dp = (char*)module_date;
6377 module_info_dlg[13].dp = (char*)module_vers;
6378 module_info_dlg[14].dp = (char*)module_build;
6379
6380 if(is_large)
6381 large_dialog(module_info_dlg);
6382
6383 int32_t ret = zc_popup_dialog(module_info_dlg,-1);
6384 jwin_center_dialog(module_info_dlg);
6385
6386
6387 }
6388
6389 int32_t onAbout_ZCP_Module()
6390 {
6391 about_zcplayer_module("About Module (.zmod)", 0);
6392 return D_O_K;
6393 }
6394
6395 //New Modules Menu for 2.55+
6396 static MENU zcmodule_menu[] =
6397 {
6398 { (char *)"&Load Module...", zc_load_zmod_module_file, NULL, 0, NULL },
6399 { (char *)"&About Module", onAbout_ZCP_Module, NULL, 0, NULL },
6400
6401 { NULL, NULL, NULL, 0, NULL }
6402 };
6403
6404 int32_t onToggleRecordingNewSaves()
6405 {
6406 if (zc_get_config("zeldadx", "replay_new_saves", false))
6407 {
6408 zc_set_config("zeldadx", "replay_new_saves", false);
6409 }
6410 else
6411 {
6412 zc_set_config("zeldadx", "replay_new_saves", true);
6413 jwin_alert("Recording", "Newly created saves will be recorded and written to a replay file.",
6414 NULL,NULL,"OK",NULL,13,27,lfont);
6415 }
6416 return D_O_K;
6417 }
6418
6419 int32_t onToggleSnapshotAllFrames()
6420 {
6421 replay_set_snapshot_all_frames(!replay_is_snapshot_all_frames());
6422 return D_O_K;
6423 }
6424
6425 int32_t onStopReplayOrRecord()
6426 {
6427 if (replay_is_replaying())
6428 {
6429 replay_quit();
6430 }
6431 else if (replay_get_mode() == ReplayMode::Record)
6432 {
6433 if (!replay_get_meta_bool("test_mode"))
6434 {
6435 jwin_alert("Recording", "You cannot stop recording a save file.",
6436 NULL,NULL,"OK",NULL,13,27,lfont);
6437 return D_CLOSE;
6438 }
6439
6440 if (jwin_alert("Stop Recording",
6441 "Save replay to disk and stop recording?",
6442 "This will stop the recording.",
6443 NULL,
6444 "Yes","No",13,27,lfont) != 1)
6445 return D_CLOSE;
6446
6447 replay_save();
6448 replay_stop();
6449 }
6450 return D_O_K;
6451 }
6452
6453 static int32_t handle_on_load_replay(ReplayMode mode)
6454 {
6455 if (Playing)
6456 {
6457 if (jwin_alert("Replay - Warning!",
6458 "Loading a replay will exit the current game.",
6459 "All unsaved progress will be lost.",
6460 "Do you wish to continue?",
6461 "Yes","No",13,27,lfont) != 1)
6462 return D_CLOSE;
6463 }
6464
6465 std::string mode_string = replay_mode_to_string(mode);
6466 mode_string[0] = std::toupper(mode_string[0]);
6467
6468 std::string line_1 = "Select a replay file to play back.";
6469 std::string line_2 = "You won't be able to save, and it won't effect existing saves.";
6470 std::string line_3 = "You can stop the replay and take over manually any time.";
6471 if (mode == ReplayMode::Update)
6472 {
6473 line_1 = "Select a replay file to update.";
6474 line_2 = "WARNING: be sure to back up the zplay file";
6475 line_3 = "and verify that the updated replay works as expected!";
6476 }
6477
6478 if (jwin_alert(mode_string.c_str(),
6479 line_1.c_str(),
6480 line_2.c_str(),
6481 line_3.c_str(),
6482 "OK","Nevermind",13,27,lfont) == 1)
6483 {
6484 char replay_path[2048];
6485 strcpy(replay_path, "replays/");
6486 if (jwin_file_select_ex(
6487 fmt::format("Load Replay (.{})", REPLAY_EXTENSION).c_str(),
6488 replay_path, REPLAY_EXTENSION.c_str(), 2048, -1, -1, lfont) == 0)
6489 return D_CLOSE;
6490
6491 replay_quit();
6492 load_replay_file_deferred(mode, replay_path);
6493 Quit = qRESET;
6494 return D_CLOSE;
6495 }
6496 return D_O_K;
6497 }
6498
6499 int32_t onLoadReplay()
6500 {
6501 return handle_on_load_replay(ReplayMode::Replay);
6502 }
6503
6504 int32_t onLoadReplayAssert()
6505 {
6506 return handle_on_load_replay(ReplayMode::Assert);
6507 }
6508
6509 int32_t onLoadReplayUpdate()
6510 {
6511 return handle_on_load_replay(ReplayMode::Update);
6512 }
6513
6514 int32_t onSaveReplay()
6515 {
6516 if (replay_get_mode() == ReplayMode::Record)
6517 {
6518 if (!replay_get_meta_bool("test_mode"))
6519 {
6520 if (jwin_alert("Save Replay",
6521 "This will save a copy of the replay up to this point.",
6522 "The official replay file will be untouched.",
6523 "Do you wish to continue?",
6524 "Yes","No",13,27,lfont) != 1)
6525 return D_CLOSE;
6526
6527 char replay_path[2048];
6528 strcpy(replay_path, replay_get_replay_path().string().c_str());
6529 if (jwin_file_select_ex(
6530 fmt::format("Save Replay (.{})", REPLAY_EXTENSION).c_str(),
6531 replay_path, REPLAY_EXTENSION.c_str(), 2048, -1, -1, lfont) == 0)
6532 return D_CLOSE;
6533
6534 if (fileexists(replay_path))
6535 {
6536 jwin_alert("Save Replay", "You cannot overwrite an existing file.",
6537 NULL,NULL,"OK",NULL,13,27,lfont);
6538 return D_CLOSE;
6539 }
6540
6541 replay_save(replay_path);
6542 }
6543 else
6544 {
6545 replay_save();
6546 }
6547 }
6548 return D_O_K;
6549 }
6550
6551 static MENU replay_menu[] =
6552 {
6553 { (char *)"Record new saves", onToggleRecordingNewSaves, NULL, 0, NULL },
6554 { (char *)"Stop replay", onStopReplayOrRecord, NULL, 0, NULL },
6555 { (char *)"Load replay", onLoadReplay, NULL, 0, NULL },
6556 { (char *)"Load replay (assert)", onLoadReplayAssert, NULL, 0, NULL },
6557 { (char *)"Load replay (update)", onLoadReplayUpdate, NULL, 0, NULL },
6558 { (char *)"Save replay", onSaveReplay, NULL, 0, NULL },
6559 { (char *)"Enable snapshot all frames", onToggleSnapshotAllFrames,NULL, 0, NULL },
6560
6561 { NULL, NULL, NULL, 0, NULL }
6562 };
6563
6564 static DIALOG credits_dlg[] =
6565 {
6566 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
6567 { jwin_win_proc, 40, 38, 241, 173, vc(14), vc(1), 0, D_EXIT, 0, 0, (void *) "Zelda Classic Credits", NULL, NULL },
6568 { jwin_frame_proc, 47, 65, 227, 115, vc(15), vc(1), 0, 0, FR_DEEP, 0, NULL, NULL, NULL },
6569 { d_bitmap_proc, 49, 67, 222, 110, vc(15), vc(1), 0, 0, 0, 0, NULL, NULL, NULL },
6570 { jwin_button_proc, 140, 184, 41, 21, vc(14), vc(1), 0, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
6571 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6572 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6573 };
6574
6575 13 static ListData dmap_list(dmaplist, &font);
6576
6577 static DIALOG goto_dlg[] =
6578 {
6579 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
6580 { jwin_win_proc, 48, 25, 205, 100, 0, 0, 0, D_EXIT, 0, 0, (void *) "Goto Location", NULL, NULL },
6581 { jwin_button_proc, 90, 176-78, 61, 21, vc(14), 0, 13, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
6582 { jwin_button_proc, 170, 176-78, 61, 21, vc(14), 0, 27, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
6583 { jwin_text_proc, 55, 129-75, 80, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "DMap:", NULL, NULL },
6584 { jwin_droplist_proc, 88, 126-75, 160, 16, 0, 0, 0, 0, 0, 0, (void *) &dmap_list, NULL, NULL },
6585 { jwin_text_proc, 55, 149-75, 80, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Screen:", NULL, NULL },
6586 { jwin_edit_proc, 132, 146-75, 91, 16, 0, 0, 0, 0, 2, 0, NULL, NULL, NULL },
6587 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6588 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6589 };
6590
6591 int32_t onGoTo()
6592 {
6593 bool music = false;
6594 music = music;
6595 sprintf(cheat_goto_screen_str,"%X",cheat_goto_screen);
6596
6597 goto_dlg[0].dp2=lfont;
6598 goto_dlg[4].d2=cheat_goto_dmap;
6599 goto_dlg[6].dp=cheat_goto_screen_str;
6600
6601 clear_keybuf();
6602
6603 if(is_large)
6604 large_dialog(goto_dlg);
6605
6606 if(zc_popup_dialog(goto_dlg,4)==1)
6607 {
6608 // dmap, screen
6609 cheats_enqueue(Cheat::GoTo, goto_dlg[4].d2, zc_min(zc_xtoi(cheat_goto_screen_str),0x7F));
6610 };
6611
6612 return D_O_K;
6613 }
6614
6615 int32_t onGoToComplete()
6616 {
6617 if(!Playing)
6618 {
6619 return D_O_K;
6620 }
6621
6622 system_pal();
6623 music_pause();
6624 pause_all_sfx();
6625 show_mouse(screen);
6626 onGoTo();
6627 eat_buttons();
6628
6629 zc_readrawkey(KEY_ESC);
6630
6631 show_mouse(NULL);
6632 game_pal();
6633 music_resume();
6634 resume_all_sfx();
6635 return D_O_K;
6636 }
6637
6638 int32_t onCredits()
6639 {
6640 go();
6641
6642 BITMAP *win = create_bitmap_ex(8,222,110);
6643
6644 if(!win)
6645 return D_O_K;
6646
6647 int32_t c=0;
6648 int32_t l=0;
6649 int32_t ol=-1;
6650 RLE_SPRITE *rle = (RLE_SPRITE*)(datafile[RLE_CREDITS].dat);
6651 RGB *pal = (RGB*)(datafile[PAL_CREDITS].dat);
6652 PALETTE tmppal;
6653
6654 rti_gui.transparency_index = 1;
6655
6656 clear_to_color(win, rti_gui.transparency_index);
6657 draw_rle_sprite(win,rle,0,0);
6658 credits_dlg[0].dp2=lfont;
6659 credits_dlg[1].fg = jwin_pal[jcDISABLED_FG];
6660 credits_dlg[2].dp = win;
6661
6662 set_palette_range(black_palette,0,127,false);
6663
6664 DIALOG_PLAYER *p = init_dialog(credits_dlg,3);
6665
6666 BITMAP* old_screen = screen;
6667 BITMAP* gui_bmp = zc_get_gui_bmp();
6668 ASSERT(gui_bmp);
6669 clear_to_color(gui_bmp, rti_gui.transparency_index);
6670 screen = gui_bmp;
6671
6672 while(update_dialog(p))
6673 {
6674 throttleFPS();
6675 ++c;
6676 l = zc_max((c>>1)-30,0);
6677
6678 if(l > rle->h)
6679 l = c = 0;
6680
6681 if(l > rle->h - 112)
6682 l = rle->h - 112;
6683
6684 clear_bitmap(win);
6685 draw_rle_sprite(win,rle,0,0-l);
6686
6687 if(c<=64)
6688 fade_interpolate(black_palette,pal,tmppal,c,0,127);
6689
6690 set_palette_range(tmppal,0,127,false);
6691
6692 if(l!=ol)
6693 {
6694 scare_mouse();
6695 d_bitmap_proc(MSG_DRAW,credits_dlg+2,0);
6696 unscare_mouse();
6697 SCRFIX();
6698 ol=l;
6699 }
6700
6701 update_hw_screen();
6702 }
6703
6704 screen = old_screen;
6705 system_pal();
6706
6707 shutdown_dialog(p);
6708 destroy_bitmap(win);
6709 //comeback();
6710
6711 rti_gui.transparency_index = 0;
6712
6713 return D_O_K;
6714 }
6715
6716 const char *midilist(int32_t index, int32_t *list_size)
6717 {
6718 if(index<0)
6719 {
6720 *list_size=0;
6721
6722 for(int32_t i=0; i<MAXMIDIS; i++)
6723 if(tunes[i].data)
6724 ++(*list_size);
6725
6726 return NULL;
6727 }
6728
6729 int32_t i=0,m=0;
6730
6731 while(m<=index && i<=MAXMIDIS)
6732 {
6733 if(tunes[i].data)
6734 ++m;
6735
6736 ++i;
6737 }
6738
6739 --i;
6740
6741 if(i==MAXMIDIS && m<index)
6742 return "(null)";
6743
6744 return tunes[i].title;
6745 }
6746
6747 /* ------- MIDI info stuff -------- */
6748
6749 char *text;
6750 midi_info *zmi;
6751 bool dialog_running;
6752 bool listening;
6753
6754 void get_info(int32_t index);
6755
6756 int32_t d_midilist_proc(int32_t msg,DIALOG *d,int32_t c)
6757 {
6758 int32_t d2 = d->d2;
6759 int32_t ret = jwin_droplist_proc(msg,d,c);
6760
6761 if(d2!=d->d2)
6762 {
6763 get_info(d->d2);
6764 }
6765
6766 return ret;
6767 }
6768
6769 int32_t d_listen_proc(int32_t msg,DIALOG *d,int32_t c)
6770 {
6771 /* 'd->d1' is offset from 'd' in DIALOG array to midilist proc */
6772
6773 int32_t ret = jwin_button_proc(msg,d,c);
6774
6775 if(ret == D_CLOSE)
6776 {
6777 // get current midi index
6778 int32_t index = (d+(d->d1))->d2;
6779 int32_t i=0, m=0;
6780
6781 while(m<=index && i<=MAXMIDIS)
6782 {
6783 if(tunes[i].data)
6784 ++m;
6785
6786 ++i;
6787 }
6788
6789 --i;
6790 jukebox(i);
6791 listening = true;
6792 ret = D_O_K;
6793 }
6794
6795 return ret;
6796 }
6797
6798 int32_t d_savemidi_proc(int32_t msg,DIALOG *d,int32_t c)
6799 {
6800 /* 'd->d1' is offset from 'd' in DIALOG array to midilist proc */
6801
6802 int32_t ret = jwin_button_proc(msg,d,c);
6803
6804 if(ret == D_CLOSE)
6805 {
6806 // get current midi index
6807 int32_t index = (d+(d->d1))->d2;
6808 int32_t i=0, m=0;
6809
6810 while(m<=index && i<=MAXMIDIS)
6811 {
6812 if(tunes[i].data)
6813 ++m;
6814
6815 ++i;
6816 }
6817
6818 --i;
6819
6820 // get file name
6821
6822 int32_t sel=0;
6823 //struct ffblk f;
6824 char title[40] = "Save MIDI: ";
6825 char fname[2048];
6826 memset(fname,0,2048);
6827 static EXT_LIST list[] =
6828 {
6829 { (char *)"MIDI files (*.mid)", (char *)"mid" },
6830 { (char *)"HTML files (*.html, *.html)", (char *)"htm html" },
6831 { NULL, NULL }
6832 };
6833
6834 strcpy(title+11, tunes[i].title);
6835 title[39] = '\0';
6836
6837 if(jwin_file_browse_ex(title, fname, list, &sel, 2048, -1, -1, lfont)==0)
6838 goto done;
6839
6840 if(exists(fname))
6841 {
6842 if(jwin_alert(title, fname, "already exists.", "Overwrite it?", "&Yes","&No",'y','n',lfont)==2)
6843 goto done;
6844 }
6845
6846 // save midi i
6847
6848 if(save_midi(fname, (MIDI*)tunes[i].data) != 0)
6849 jwin_alert(title, "Error saving MIDI to", fname, NULL, "Darn", NULL,13,27,lfont);
6850
6851 done:
6852 chop_path(fname);
6853 ret = D_REDRAW;
6854 }
6855
6856 return ret;
6857 }
6858
6859 13 static ListData midi_list(midilist, &font);
6860
6861 static DIALOG midi_dlg[] =
6862 {
6863 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
6864 { jwin_win_proc, 8, 28, 304, 184, 0, 0, 0, D_EXIT, 0, 0, (void *) "MIDI Info", NULL, NULL },
6865 { jwin_text_proc, 32, 60, 40, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Tune:", NULL, NULL },
6866 { d_midilist_proc, 80, 56, 192, 16, 0, 0, 0, 0, 0, 0, (void *) &midi_list, NULL, NULL },
6867 { jwin_textbox_proc, 15, 80, 290, 96, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6868 { d_listen_proc, 24, 183, 72, 21, 0, 0, 'l', D_EXIT, -2, 0, (void *) "&Listen", NULL, NULL },
6869 { d_savemidi_proc, 108, 183, 72, 21, 0, 0, 's', D_EXIT, -3, 0, (void *) "&Save", NULL, NULL },
6870 { jwin_button_proc, 236, 183, 61, 21, 0, 0, 'k', D_EXIT, 0, 0, (void *) "O&K", NULL, NULL },
6871 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
6872 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
6873 };
6874
6875 void get_info(int32_t index)
6876 {
6877 int32_t i=0, m=0;
6878
6879 while(m<=index && i<=MAXMIDIS)
6880 {
6881 if(tunes[i].data)
6882 ++m;
6883
6884 ++i;
6885 }
6886
6887 --i;
6888
6889 if(i==MAXMIDIS && m<index)
6890 strcpy(text,"(null)");
6891 else
6892 {
6893 get_midi_info((MIDI*)tunes[i].data,zmi);
6894 get_midi_text((MIDI*)tunes[i].data,zmi,text);
6895 }
6896
6897 midi_dlg[0].dp2=lfont;
6898 midi_dlg[3].dp = text;
6899 midi_dlg[3].d1 = midi_dlg[3].d2 = 0;
6900 midi_dlg[5].flags = (tunes[i].flags&tfDISABLESAVE) ? D_DISABLED : D_EXIT;
6901
6902 if(dialog_running)
6903 {
6904 scare_mouse();
6905 jwin_textbox_proc(MSG_DRAW,midi_dlg+3,0);
6906 d_savemidi_proc(MSG_DRAW,midi_dlg+5,0);
6907 unscare_mouse();
6908 }
6909 }
6910
6911 int32_t onMIDICredits()
6912 {
6913 text = (char*)malloc(4096);
6914 zmi = (midi_info*)malloc(sizeof(midi_info));
6915
6916 if(!text || !zmi)
6917 {
6918 jwin_alert(NULL,"Not enough memory",NULL,NULL,"OK",NULL,13,27,lfont);
6919 return D_O_K;
6920 }
6921
6922 bool do_pause_midi = midi_pos >= 0 && currmidi;
6923 auto restore_midi = currmidi;
6924 if(do_pause_midi)
6925 {
6926 paused_midi_pos = midi_pos;
6927 stop_midi();
6928 midi_paused=true;
6929 midi_suspended = midissuspHALTED;
6930 }
6931
6932 midi_dlg[0].dp2=lfont;
6933 midi_dlg[2].d1 = 0;
6934 midi_dlg[2].d2 = 0;
6935 midi_dlg[4].flags = D_EXIT;
6936 midi_dlg[5].flags = (tunes[midi_dlg[2].d1].flags&tfDISABLESAVE) ? D_DISABLED : D_EXIT;
6937
6938 listening = false;
6939 dialog_running=false;
6940 get_info(0);
6941
6942 dialog_running=true;
6943
6944 if(is_large)
6945 large_dialog(midi_dlg);
6946
6947 zc_popup_dialog(midi_dlg,0);
6948 dialog_running=false;
6949
6950 if(listening)
6951 music_stop();
6952
6953 if(do_pause_midi)
6954 {
6955 midi_suspended = midissuspRESUME;
6956 currmidi = restore_midi;
6957 midi_pos = paused_midi_pos;
6958 }
6959
6960 if(text) free(text);
6961 if(zmi) free(zmi);
6962 return D_O_K;
6963 }
6964
6965 int32_t onAbout()
6966 {
6967 char buf1[80]={0};
6968 std::ostringstream oss;
6969 sprintf(buf1,"%s (%s), Version: %s", ZC_PLAYER_NAME,PROJECT_NAME,ZC_PLAYER_V);
6970 oss << buf1 << '\n';
6971 sprintf(buf1, "%s, Build %d", ALPHA_VER_STR, VERSION_BUILD);
6972 oss << buf1 << '\n';
6973 sprintf(buf1,"Build Date: %s %s, %d at @ %s %s", dayextension(BUILDTM_DAY).c_str(), (char*)months[BUILDTM_MONTH], BUILDTM_YEAR, __TIME__, __TIMEZONE__);
6974 oss << buf1 << '\n';
6975 sprintf(buf1, "Built By: %s", DEV_SIGNOFF);
6976 oss << buf1 << '\n';
6977 sprintf(buf1, "Tag: %s", getReleaseTag());
6978 oss << buf1 << '\n';
6979
6980 InfoDialog("About ZC", oss.str()).show();
6981 return D_O_K;
6982 }
6983
6984 int32_t onQuest()
6985 {
6986 char fname[100];
6987 strcpy(fname, get_filename(qstpath));
6988 quest_dlg[0].dp2=lfont;
6989 quest_dlg[1].dp = fname;
6990
6991 if(QHeader.quest_number==0)
6992 sprintf(str_a,"Custom");
6993 else
6994 sprintf(str_a,"%d",QHeader.quest_number);
6995
6996 sprintf(str_s,"%s",VerStr(QHeader.zelda_version));
6997
6998 quest_dlg[11].d1 = quest_dlg[9].d1 = 0;
6999 quest_dlg[11].d2 = quest_dlg[9].d2 = 0;
7000
7001 if(is_large)
7002 large_dialog(quest_dlg);
7003
7004 zc_popup_dialog(quest_dlg, 0);
7005 return D_O_K;
7006 }
7007
7008 void call_vidmode_dlg();
7009 int32_t onVidMode()
7010 {
7011 call_vidmode_dlg();
7012 return D_O_K;
7013 }
7014
7015 #define addToHash(c,b,h) if(h->find(c ## key) == h->end()) \
7016 {(*h)[c ## key]=true;} else { if ( c ## key != 0 ) b = false;}
7017 //Added an extra statement, so that if the key is cleared to 0, the cleared
7018 //keybinding status need not be unique. -Z ( 1st April, 2019 )
7019
7020 void load_ukeys(int32_t* arr)
7021 {
7022 arr[ukey_a] = Akey;
7023 arr[ukey_b] = Bkey;
7024 arr[ukey_s] = Skey;
7025 arr[ukey_l] = Lkey;
7026 arr[ukey_r] = Rkey;
7027 arr[ukey_p] = Pkey;
7028 arr[ukey_ex1] = Exkey1;
7029 arr[ukey_ex2] = Exkey2;
7030 arr[ukey_ex3] = Exkey3;
7031 arr[ukey_ex4] = Exkey4;
7032 arr[ukey_du] = DUkey;
7033 arr[ukey_dd] = DDkey;
7034 arr[ukey_dl] = DLkey;
7035 arr[ukey_dr] = DRkey;
7036 arr[ukey_mod1a] = cheat_modifier_keys[0];
7037 arr[ukey_mod1b] = cheat_modifier_keys[1];
7038 arr[ukey_mod2a] = cheat_modifier_keys[2];
7039 arr[ukey_mod2b] = cheat_modifier_keys[3];
7040 };
7041
7042 static const char* ukey_names[] = {
7043 "A", "B", "Start", "L", "R", "Map",
7044 "Ex1", "Ex2", "Ex3", "Ex4", "Up", "Down",
7045 "Left", "Right", "Cheat Mod L1", "Cheat Mod L2",
7046 "Cheat Mod R1", "Cheat Mod R2",
7047 };
7048 std::string get_ukey_name(int32_t k)
7049 {
7050 if (k < num_ukey) return ukey_names[k];
7051 return "";
7052 }
7053
7054 int32_t onKeyboard()
7055 {
7056 int32_t a = Akey;
7057 int32_t b = Bkey;
7058 int32_t s = Skey;
7059 int32_t l = Lkey;
7060 int32_t r = Rkey;
7061 int32_t p = Pkey;
7062 int32_t ex1 = Exkey1;
7063 int32_t ex2 = Exkey2;
7064 int32_t ex3 = Exkey3;
7065 int32_t ex4 = Exkey4;
7066 int32_t du = DUkey;
7067 int32_t dd = DDkey;
7068 int32_t dl = DLkey;
7069 int32_t dr = DRkey;
7070 int32_t mod1a = cheat_modifier_keys[0];
7071 int32_t mod1b = cheat_modifier_keys[1];
7072 int32_t mod2a = cheat_modifier_keys[2];
7073 int32_t mod2b = cheat_modifier_keys[3];
7074 bool done=false;
7075 int32_t ret;
7076
7077 keyboard_control_dlg[0].dp2=lfont;
7078
7079 if(is_large)
7080 large_dialog(keyboard_control_dlg);
7081
7082 while(!done)
7083 {
7084 ret = zc_popup_dialog(keyboard_control_dlg,3);
7085
7086 if(ret==3) // OK
7087 {
7088 int32_t ukeys[num_ukey];
7089 load_ukeys(ukeys);
7090 std::vector<std::string> uniqueError;
7091 for(int32_t q = 0; q < num_ukey; ++q)
7092 {
7093 for(int32_t p = q+1; p < num_ukey; ++p)
7094 {
7095 if(ukeys[q] == ukeys[p] && ukeys[q] != 0)
7096 {
7097 char buf[64];
7098 sprintf(buf, "'%s' conflicts with '%s'", get_ukey_name(q).c_str(), get_ukey_name(p).c_str());
7099 std::string str(buf);
7100 uniqueError.push_back(str);
7101 }
7102 }
7103 }
7104 if(uniqueError.size() == 0)
7105 {
7106 done = true;
7107 save_control_configs(true);
7108 }
7109 else
7110 {
7111 box_start(1, "Duplicate Keys", lfont, sfont, false, keyboard_control_dlg[0].w,keyboard_control_dlg[0].h, 2);
7112 box_out("Cannot have duplicate keybinds!"); box_eol();
7113 for(std::vector<std::string>::iterator it = uniqueError.begin();
7114 it != uniqueError.end(); ++it)
7115 {
7116 box_out((*it).c_str()); box_eol();
7117 }
7118 box_end(true);
7119 }
7120 /* Old uniqueness check
7121 std::map<int32_t,bool> *keyhash = new std::map<int32_t,bool>();
7122 bool unique = true;
7123 addToHash(A,unique,keyhash);
7124 addToHash(B,unique,keyhash);
7125 addToHash(S,unique,keyhash);
7126 addToHash(L,unique,keyhash);
7127 addToHash(R,unique,keyhash);
7128 addToHash(P,unique,keyhash);
7129 addToHash(DU,unique,keyhash);
7130 addToHash(DD,unique,keyhash);
7131 addToHash(DL,unique,keyhash);
7132 addToHash(DR,unique,keyhash);
7133
7134 if(keyhash->find(Exkey1) == keyhash->end())
7135 {
7136 (*keyhash)[Exkey1]=true;
7137 }
7138 else
7139 {
7140 if ( Exkey1 != 0 ) unique = false;
7141 }
7142
7143 if(keyhash->find(Exkey2) == keyhash->end())
7144 {
7145 (*keyhash)[Exkey2]=true;
7146 }
7147 else
7148 {
7149 if ( Exkey2 != 0 ) unique = false;
7150 }
7151
7152 if(keyhash->find(Exkey3) == keyhash->end())
7153 {
7154 (*keyhash)[Exkey3]=true;
7155 }
7156 else
7157 {
7158 if ( Exkey3 != 0 ) unique = false;
7159 }
7160
7161 if(keyhash->find(Exkey4) == keyhash->end())
7162 {
7163 (*keyhash)[Exkey4]=true;
7164 }
7165 else
7166 {
7167 if ( Exkey4 != 0 )unique = false;
7168 }
7169 //modifier keys
7170 if(keyhash->find(cheat_modifier_keys[0]) == keyhash->end())
7171 {
7172 (*keyhash)[cheat_modifier_keys[0]]=true;
7173 }
7174 else
7175 {
7176 if ( cheat_modifier_keys[0] != 0 ) unique = false;
7177 }
7178 if(keyhash->find(cheat_modifier_keys[1]) == keyhash->end())
7179 {
7180 (*keyhash)[cheat_modifier_keys[1]]=true;
7181 }
7182 else
7183 {
7184 if ( cheat_modifier_keys[1] != 0 ) unique = false;
7185 }
7186 if(keyhash->find(cheat_modifier_keys[2]) == keyhash->end())
7187 {
7188 (*keyhash)[cheat_modifier_keys[2]]=true;
7189 }
7190 else
7191 {
7192 if ( cheat_modifier_keys[2] != 0 ) unique = false;
7193 }
7194 if(keyhash->find(cheat_modifier_keys[3]) == keyhash->end())
7195 {
7196 (*keyhash)[cheat_modifier_keys[3]]=true;
7197 }
7198 else
7199 {
7200 if ( cheat_modifier_keys[3] != 0 ) unique = false;
7201 }
7202
7203 delete keyhash;
7204
7205 if(unique)
7206 done=true;
7207 else
7208 jwin_alert("Error", "Key bindings must be unique!", "", "", "OK",NULL,'o',0,lfont);
7209 */
7210 }
7211 else // Cancel
7212 {
7213 Akey = a;
7214 Bkey = b;
7215 Skey = s;
7216 Lkey = l;
7217 Rkey = r;
7218 Pkey = p;
7219 Exkey1 = ex1;
7220 Exkey2 = ex2;
7221 Exkey3 = ex3;
7222 Exkey4 = ex4;
7223 DUkey = du;
7224 DDkey = dd;
7225 DLkey = dl;
7226 DRkey = dr;
7227 cheat_modifier_keys[0] = mod1a;
7228 cheat_modifier_keys[1] = mod1b;
7229 cheat_modifier_keys[2] = mod2a;
7230 cheat_modifier_keys[3] = mod2b;
7231
7232 done=true;
7233 }
7234
7235 rest(1);
7236 }
7237
7238 return D_O_K;
7239 }
7240
7241 int32_t onGamepad()
7242 {
7243 int32_t a = Abtn;
7244 int32_t b = Bbtn;
7245 int32_t s = Sbtn;
7246 int32_t l = Lbtn;
7247 int32_t r = Rbtn;
7248 int32_t m = Mbtn;
7249 int32_t p = Pbtn;
7250 int32_t ex1 = Exbtn1;
7251 int32_t ex2 = Exbtn2;
7252 int32_t ex3 = Exbtn3;
7253 int32_t ex4 = Exbtn4;
7254 int32_t up = DUbtn;
7255 int32_t down = DDbtn;
7256 int32_t left = DLbtn;
7257 int32_t right = DRbtn;
7258
7259 gamepad_dlg[0].dp2=lfont;
7260 if(analog_movement)
7261 gamepad_dlg[56].flags|=D_SELECTED;
7262 else
7263 gamepad_dlg[56].flags&=~D_SELECTED;
7264
7265 if(is_large)
7266 large_dialog(gamepad_dlg);
7267
7268 int32_t ret = zc_popup_dialog(gamepad_dlg,4);
7269
7270 if(ret == 4) //OK
7271 {
7272 analog_movement = gamepad_dlg[56].flags&D_SELECTED;
7273 save_control_configs(false);
7274 }
7275 else //Cancel
7276 {
7277 Abtn = a;
7278 Bbtn = b;
7279 Sbtn = s;
7280 Lbtn = l;
7281 Rbtn = r;
7282 Mbtn = m;
7283 Pbtn = p;
7284 Exbtn1 = ex1;
7285 Exbtn2 = ex2;
7286 Exbtn3 = ex3;
7287 Exbtn4 = ex4;
7288 DUbtn = up;
7289 DDbtn = down;
7290 DLbtn = left;
7291 DRbtn = right;
7292 }
7293
7294 return D_O_K;
7295 }
7296
7297 int32_t onSound()
7298 {
7299 if ( FFCore.coreflags&FFCORE_SCRIPTED_MIDI_VOLUME )
7300 {
7301 master_volume(-1,((int32_t)FFCore.usr_midi_volume));
7302 }
7303 if ( FFCore.coreflags&FFCORE_SCRIPTED_DIGI_VOLUME )
7304 {
7305 master_volume((int32_t)(FFCore.usr_digi_volume),1);
7306 }
7307 if ( FFCore.coreflags&FFCORE_SCRIPTED_MUSIC_VOLUME )
7308 {
7309 emusic_volume = (int32_t)FFCore.usr_music_volume;
7310 }
7311 if ( FFCore.coreflags&FFCORE_SCRIPTED_SFX_VOLUME )
7312 {
7313 sfx_volume = (int32_t)FFCore.usr_sfx_volume;
7314 }
7315 if ( FFCore.coreflags&FFCORE_SCRIPTED_PANSTYLE )
7316 {
7317 pan_style = (int32_t)FFCore.usr_panstyle;
7318 }
7319
7320 int32_t m = midi_volume;
7321 int32_t d = digi_volume;
7322 int32_t e = emusic_volume;
7323 int32_t b = zcmusic_bufsz;
7324 int32_t s = sfx_volume;
7325 int32_t p = pan_style;
7326 pan_style = vbound(pan_style,0,3);
7327
7328 sound_dlg[0].dp2=lfont;
7329
7330 if(is_large)
7331 large_dialog(sound_dlg);
7332
7333 midi_dp[1] = sound_dlg[6].x;
7334 midi_dp[2] = sound_dlg[6].y;
7335 digi_dp[1] = sound_dlg[7].x;
7336 digi_dp[2] = sound_dlg[7].y;
7337 emus_dp[1] = sound_dlg[8].x;
7338 emus_dp[2] = sound_dlg[8].y;
7339 buf_dp[1] = sound_dlg[9].x;
7340 buf_dp[2] = sound_dlg[9].y;
7341 sfx_dp[1] = sound_dlg[10].x;
7342 sfx_dp[2] = sound_dlg[10].y;
7343 pan_dp[1] = sound_dlg[11].x;
7344 pan_dp[2] = sound_dlg[11].y;
7345 sound_dlg[15].d2 = (midi_volume==255) ? 32 : midi_volume>>3;
7346 sound_dlg[16].d2 = (digi_volume==255) ? 32 : digi_volume>>3;
7347 sound_dlg[17].d2 = (emusic_volume==255) ? 32 : emusic_volume>>3;
7348 sound_dlg[18].d2 = zcmusic_bufsz;
7349 sound_dlg[19].d2 = (sfx_volume==255) ? 32 : sfx_volume>>3;
7350 sound_dlg[20].d2 = pan_style;
7351
7352 int32_t ret = zc_popup_dialog(sound_dlg,1);
7353
7354 if(ret==2)
7355 {
7356 master_volume(digi_volume,midi_volume);
7357
7358 for(int32_t i=0; i<WAV_COUNT; ++i)
7359 {
7360 //allegro assertion fails when passing in -1 as voice -DD
7361 if(sfx_voice[i] > 0)
7362 voice_set_volume(sfx_voice[i], sfx_volume);
7363 }
7364 zc_set_config(sfx_sect,"digi",digi_volume);
7365 zc_set_config(sfx_sect,"midi",midi_volume);
7366 zc_set_config(sfx_sect,"sfx",sfx_volume);
7367 zc_set_config(sfx_sect,"emusic",emusic_volume);
7368 zc_set_config(sfx_sect,"pan",pan_style);
7369 zc_set_config(sfx_sect,"zcmusic_bufsz",zcmusic_bufsz);
7370 }
7371 else
7372 {
7373 midi_volume = m;
7374 digi_volume = d;
7375 emusic_volume = e;
7376 zcmusic_bufsz = b;
7377 sfx_volume = s;
7378 pan_style = p;
7379 }
7380
7381 return D_O_K;
7382 }
7383
7384 int32_t queding(char const* s1, char const* s2, char const* s3)
7385 {
7386 return jwin_alert(ZC_str,s1,s2,s3,"&Yes","&No",'y','n',lfont);
7387 }
7388
7389 int32_t onQuit()
7390 {
7391 if(Playing)
7392 {
7393 int32_t ret=0;
7394
7395 if(get_bit(quest_rules, qr_NOCONTINUE))
7396 {
7397 if(standalone_mode)
7398 {
7399 ret=queding("End current game?",
7400 "The continue screen is disabled; the game",
7401 "will be reloaded from the last save.");
7402 }
7403 else
7404 {
7405 ret=queding("End current game?",
7406 "The continue screen is disabled. You will",
7407 "be returned to the file select screen.");
7408 }
7409 }
7410 else
7411 ret=queding("End current game?",NULL,NULL);
7412
7413 if(ret==1)
7414 {
7415 disableClickToFreeze=false;
7416 Quit=qQUIT;
7417
7418 // Trying to evade a door repair charge?
7419 if(repaircharge)
7420 {
7421 game->change_drupy(-repaircharge);
7422 repaircharge=0;
7423 }
7424
7425 return D_CLOSE;
7426 }
7427 }
7428
7429 return D_O_K;
7430 }
7431
7432 int32_t onTryQuitMenu()
7433 {
7434 return onTryQuit(true);
7435 }
7436
7437 int32_t onTryQuit(bool inMenu)
7438 {
7439 if(Playing && !(GameFlags & GAMEFLAG_NO_F6))
7440 {
7441 if(get_bit(quest_rules,qr_OLD_F6))
7442 {
7443 if(inMenu) onQuit();
7444 else /*if(!get_bit(quest_rules, qr_NOCONTINUE))*/ f_Quit(qQUIT);
7445 }
7446 else
7447 {
7448 disableClickToFreeze=false;
7449 GameFlags |= GAMEFLAG_TRYQUIT;
7450 }
7451 return D_CLOSE;
7452 }
7453
7454 return D_O_K;
7455 }
7456
7457 int32_t onReset()
7458 {
7459 if(queding(" Reset system? ",NULL,NULL)==1)
7460 {
7461 disableClickToFreeze=false;
7462 Quit=qRESET;
7463 replay_quit();
7464 return D_CLOSE;
7465 }
7466
7467 return D_O_K;
7468 }
7469
7470 int32_t onExit()
7471 {
7472 if(queding(" Quit Zelda Classic? ",NULL,NULL)==1)
7473 {
7474 Quit=qEXIT;
7475 return D_CLOSE;
7476 }
7477
7478 return D_O_K;
7479 }
7480
7481 int32_t onTitle_NES()
7482 {
7483 title_version=0;
7484 zc_set_config(cfg_sect,"title",title_version);
7485 return D_O_K;
7486 }
7487 int32_t onTitle_DX()
7488 {
7489 title_version=1;
7490 zc_set_config(cfg_sect,"title",title_version);
7491 return D_O_K;
7492 }
7493 int32_t onTitle_25()
7494 {
7495 title_version=2;
7496 zc_set_config(cfg_sect,"title",title_version);
7497 return D_O_K;
7498 }
7499
7500 int32_t onDebug()
7501 {
7502 if(debug_enabled)
7503 set_debug(!get_debug());
7504 return D_O_K;
7505 }
7506
7507 int32_t onHeartBeep()
7508 {
7509 heart_beep=!heart_beep;
7510 zc_set_config(cfg_sect,"heart_beep",heart_beep);
7511 return D_O_K;
7512 }
7513
7514 int32_t onSaveIndicator()
7515 {
7516 use_save_indicator=!use_save_indicator;
7517 zc_set_config(cfg_sect,"save_indicator",use_save_indicator);
7518 return D_O_K;
7519 }
7520
7521 int32_t onEpilepsy()
7522 {
7523 if(jwin_alert3(
7524 "Epilepsy Flash Reduction",
7525 "Enabling this will reduce the intensity of flashing and screen wave effects.",
7526 "Disabling this will restore standard flash and wavy behaviour.",
7527 "Proceed?",
7528 "&Yes",
7529 "&No",
7530 NULL,
7531 'y',
7532 'n',
7533 0,
7534 lfont) == 1)
7535 {
7536 epilepsyFlashReduction = epilepsyFlashReduction ? 0 : 1;
7537 zc_set_config("zeldadx","checked_epilepsy",1);
7538 zc_set_config(cfg_sect,"epilepsy_flash_reduction",epilepsyFlashReduction);
7539 }
7540 return D_O_K;
7541 }
7542
7543 int32_t onTriforce()
7544 {
7545 for(int32_t i=0; i<MAXINITTABS; ++i)
7546 {
7547 init_tabs[i].flags&=~D_SELECTED;
7548 }
7549
7550 init_tabs[3].flags=D_SELECTED;
7551 return onCheatConsole();
7552 /*triforce_dlg[0].dp2=lfont;
7553 for(int32_t i=1; i<=8; i++)
7554 triforce_dlg[i].flags = (game->lvlitems[i] & liTRIFORCE) ? D_SELECTED : 0;
7555
7556 if(zc_popup_dialog (triforce_dlg,-1)==9)
7557 {
7558 for(int32_t i=1; i<=8; i++)
7559 {
7560 game->lvlitems[i] &= ~liTRIFORCE;
7561 game->lvlitems[i] |= (triforce_dlg[i].flags & D_SELECTED) ? liTRIFORCE : 0;
7562 }
7563 }
7564 return D_O_K;*/
7565 }
7566
7567 bool rc = false;
7568 /*
7569 int32_t onEquipment()
7570 {
7571 for (int32_t i=0; i<MAXINITTABS; ++i)
7572 {
7573 init_tabs[i].flags&=~D_SELECTED;
7574 }
7575 init_tabs[0].flags=D_SELECTED;
7576 return onCheatConsole();
7577 }
7578 */
7579
7580 int32_t onItems()
7581 {
7582 for(int32_t i=0; i<MAXINITTABS; ++i)
7583 {
7584 init_tabs[i].flags&=~D_SELECTED;
7585 }
7586
7587 init_tabs[1].flags=D_SELECTED;
7588 return onCheatConsole();
7589 }
7590
7591 static DIALOG getnum_dlg[] =
7592 {
7593 // (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp)
7594 { jwin_win_proc, 80, 80, 160, 72, vc(0), vc(11), 0, D_EXIT, 0, 0, NULL, NULL, NULL },
7595 { jwin_text_proc, 104, 104+4, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Number:", NULL, NULL },
7596 { jwin_edit_proc, 168, 104, 48, 16, 0, 0, 0, 0, 6, 0, NULL, NULL, NULL },
7597 { jwin_button_proc, 90, 126, 61, 21, vc(0), vc(11), 13, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
7598 { jwin_button_proc, 170, 126, 61, 21, vc(0), vc(11), 27, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
7599 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
7600 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
7601 };
7602
7603 int32_t getnumber(const char *prompt,int32_t initialval)
7604 {
7605 char buf[20];
7606 sprintf(buf,"%d",initialval);
7607 getnum_dlg[0].dp=(void *)prompt;
7608 getnum_dlg[0].dp2=lfont;
7609 getnum_dlg[2].dp=buf;
7610
7611 if(is_large)
7612 large_dialog(getnum_dlg);
7613
7614 if(zc_popup_dialog(getnum_dlg,2)==3)
7615 return atoi(buf);
7616
7617 return initialval;
7618 }
7619
7620 int32_t onLife()
7621 {
7622 int value = vbound(getnumber("Life",game->get_life()),1,game->get_maxlife());
7623 cheats_enqueue(Cheat::Life, value);
7624 return D_O_K;
7625 }
7626
7627 int32_t onHeartC()
7628 {
7629 int max_life = vbound(getnumber("Heart Containers",game->get_maxlife()/game->get_hp_per_heart()),1,4095) * game->get_hp_per_heart();
7630 int life = vbound(getnumber("Life",game->get_life()/game->get_hp_per_heart()),1,max_life/game->get_hp_per_heart())*game->get_hp_per_heart();
7631 cheats_enqueue(Cheat::MaxLife, max_life);
7632 cheats_enqueue(Cheat::Life, life);
7633 return D_O_K;
7634 }
7635
7636 int32_t onMagicC()
7637 {
7638 int max_magic = vbound(getnumber("Magic Containers",game->get_maxmagic()/game->get_mp_per_block()),0,2047) * game->get_mp_per_block();
7639 int magic = vbound(getnumber("Magic",game->get_magic()/game->get_mp_per_block()),0,game->get_maxmagic()/game->get_mp_per_block())*game->get_mp_per_block();
7640 cheats_enqueue(Cheat::MaxMagic, max_magic);
7641 cheats_enqueue(Cheat::Magic, magic);
7642 return D_O_K;
7643 }
7644
7645 int32_t onRupies()
7646 {
7647 int value = vbound(getnumber("Rupees",game->get_rupies()),0,game->get_maxcounter(1));
7648 cheats_enqueue(Cheat::Rupies, value);
7649 return D_O_K;
7650 }
7651
7652 int32_t onMaxBombs()
7653 {
7654 int value = vbound(getnumber("Max Bombs",game->get_maxbombs()),0,0xFFFF);
7655 cheats_enqueue(Cheat::MaxBombs, value);
7656 cheats_enqueue(Cheat::Bombs, value);
7657 return D_O_K;
7658 }
7659
7660 int32_t onRefillLife()
7661 {
7662 cheats_enqueue(Cheat::Life, game->get_maxlife());
7663 return D_O_K;
7664 }
7665 int32_t onRefillMagic()
7666 {
7667 cheats_enqueue(Cheat::Magic, game->get_maxmagic());
7668 return D_O_K;
7669 }
7670 int32_t onClock()
7671 {
7672 cheats_enqueue(Cheat::Clock);
7673 return D_O_K;
7674 }
7675
7676 int32_t onQstPath()
7677 {
7678 char path[2048];
7679
7680 chop_path(qstdir);
7681 strcpy(path,qstdir);
7682
7683 go();
7684
7685 if(jwin_dfile_select_ex("Quest File Directory", path, "qst", 2048, -1, -1, lfont))
7686 {
7687 chop_path(path);
7688 fix_filename_case(path);
7689 fix_filename_slashes(path);
7690 strcpy(qstdir,path);
7691 strcpy(qstpath,qstdir);
7692 }
7693
7694 comeback();
7695 return D_O_K;
7696 }
7697
7698 #include "dialog/cheat_dialog.h"
7699 int32_t onCheat()
7700 {
7701 call_setcheat_dialog();
7702 game->set_cheat(maxcheat);
7703 if(cheat) game->did_cheat(true);
7704 return D_O_K;
7705 }
7706
7707 int32_t onCheatRupies()
7708 {
7709 cheats_enqueue(Cheat::Rupies, game->get_maxcounter(1));
7710 return D_O_K;
7711 }
7712
7713 int32_t onCheatArrows()
7714 {
7715 cheats_enqueue(Cheat::Arrows, game->get_maxarrows());
7716 return D_O_K;
7717 }
7718
7719 int32_t onCheatBombs()
7720 {
7721 cheats_enqueue(Cheat::Bombs, game->get_maxbombs(), game->get_maxcounter(6));
7722 return D_O_K;
7723 }
7724
7725 // *** screen saver
7726
7727 2204025 int32_t after_time()
7728 {
7729
1/2
✓ Branch 0 taken 2204025 times.
✗ Branch 1 not taken.
2204025 if(ss_enable == 0)
7730 return INT_MAX;
7731
7732
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
2204025 if(ss_after <= 0)
7733 return 5 * 60;
7734
7735
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
2204025 if(ss_after <= 3)
7736 return ss_after * 15 * 60;
7737
7738
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2204025 times.
2204025 if(ss_after <= 13)
7739 return (ss_after - 3) * 60 * 60;
7740
7741 2204025 return MAX_IDLE + 1;
7742 2204025 }
7743
7744 static const char *after_str[15] =
7745 {
7746 " 5 sec", "15 sec", "30 sec", "45 sec", " 1 min", " 2 min", " 3 min",
7747 " 4 min", " 5 min", " 6 min", " 7 min", " 8 min", " 9 min", "10 min",
7748 "Never"
7749 };
7750
7751 const char *after_list(int32_t index, int32_t *list_size)
7752 {
7753 if(index < 0)
7754 {
7755 *list_size = 15;
7756 return NULL;
7757 }
7758
7759 return after_str[index];
7760 }
7761
7762 13 static ListData after__list(after_list, &font);
7763
7764 static DIALOG scrsaver_dlg[] =
7765 {
7766 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
7767 13 { jwin_win_proc, 32, 64, 256, 136, 0, 0, 0, D_EXIT, 0, 0, (void *) "Screen Saver Settings", NULL, NULL },
7768 13 { jwin_frame_proc, 42, 92, 236, 70, 0, 0, 0, 0, FR_ETCHED,0, NULL, NULL, NULL },
7769 13 { jwin_text_proc, 60, 104, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Run After", NULL, NULL },
7770 13 { jwin_text_proc, 60, 128, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Speed", NULL, NULL },
7771 13 { jwin_text_proc, 60, 144, 48, 8, vc(0), vc(11), 0, 0, 0, 0, (void *) "Density", NULL, NULL },
7772 13 { jwin_droplist_proc, 144, 100, 96, 16, 0, 0, 0, 0, 0, 0, (void *) &after__list, NULL, NULL },
7773 13 { jwin_slider_proc, 144, 128, 116, 8, vc(0), jwin_pal[jcBOX], 0, 0, 6, 0, NULL, NULL, NULL },
7774 13 { jwin_slider_proc, 144, 144, 116, 8, vc(0), jwin_pal[jcBOX], 0, 0, 6, 0, NULL, NULL, NULL },
7775 13 { jwin_button_proc, 42, 170, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "OK", NULL, NULL },
7776 13 { jwin_button_proc, 124, 170, 72, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "Preview", NULL, NULL },
7777 13 { jwin_button_proc, 218, 170, 61, 21, 0, 0, 0, D_EXIT, 0, 0, (void *) "Cancel", NULL, NULL },
7778 13 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
7779 13 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
7780 };
7781
7782 int32_t onScreenSaver()
7783 {
7784 scrsaver_dlg[0].dp2=lfont;
7785 int32_t oldcfgs[3];
7786 scrsaver_dlg[5].d1 = scrsaver_dlg[5].d2 = oldcfgs[0] = ss_after;
7787 scrsaver_dlg[6].d2 = oldcfgs[1] = ss_speed;
7788 scrsaver_dlg[7].d2 = oldcfgs[2] = ss_density;
7789
7790 if(is_large)
7791 large_dialog(scrsaver_dlg);
7792
7793 int32_t ret = zc_popup_dialog(scrsaver_dlg,-1);
7794
7795 if(ret == 8 || ret == 9)
7796 {
7797 ss_after = scrsaver_dlg[5].d1;
7798 ss_speed = scrsaver_dlg[6].d2;
7799 ss_density = scrsaver_dlg[7].d2;
7800 if(oldcfgs[0] != ss_after)
7801 zc_set_config(cfg_sect,"ss_after",ss_after);
7802 if(oldcfgs[1] != ss_speed)
7803 zc_set_config(cfg_sect,"ss_speed",ss_speed);
7804 if(oldcfgs[2] != ss_density)
7805 zc_set_config(cfg_sect,"ss_density",ss_density);
7806 }
7807
7808 if(ret == 9)
7809 // preview Screen Saver
7810 {
7811 clear_keybuf();
7812 scare_mouse();
7813 Matrix(ss_speed, ss_density, 30);
7814 system_pal();
7815 unscare_mouse();
7816 }
7817
7818 return D_O_K;
7819 }
7820
7821 /***** Menus *****/
7822
7823 static MENU game_menu[] =
7824 {
7825 { (char *)"&Continue\tESC", onContinue, NULL, 0, NULL },
7826 { (char *)"", NULL, NULL, 0, NULL },
7827 { (char *)"L&oad Quest...", onCustomGame, NULL, 0, NULL },
7828 { (char *)"&End Game\tF6", onTryQuitMenu, NULL, 0, NULL },
7829 { (char *)"", NULL, NULL, 0, NULL },
7830 #ifdef __EMSCRIPTEN__
7831 { (char *)"&Reset\tF7", onReset, NULL, 0, NULL },
7832 #elif defined(ALLEGRO_MACOSX)
7833 { (char *)"&Reset\tF7", onReset, NULL, 0, NULL },
7834 { (char *)"&Quit\tF8", onExit, NULL, 0, NULL },
7835 #else
7836 { (char *)"&Reset\tF9", onReset, NULL, 0, NULL },
7837 { (char *)"&Quit\tF10", onExit, NULL, 0, NULL },
7838 #endif
7839 { NULL, NULL, NULL, 0, NULL }
7840 };
7841
7842 static MENU title_menu[] =
7843 {
7844 { (char *)"&Original", onTitle_NES, NULL, 0, NULL },
7845 { (char *)"&Zelda Classic", onTitle_DX, NULL, 0, NULL },
7846 { (char *)"Zelda Classic &2.50", onTitle_25, NULL, 0, NULL },
7847 { NULL, NULL, NULL, 0, NULL }
7848 };
7849
7850 static MENU snapshot_format_menu[] =
7851 {
7852 { (char *)"&BMP", onSetSnapshotFormat, NULL, 0, NULL },
7853 { (char *)"&GIF", onSetSnapshotFormat, NULL, 0, NULL },
7854 { (char *)"&JPG", onSetSnapshotFormat, NULL, 0, NULL },
7855 { (char *)"&PNG", onSetSnapshotFormat, NULL, 0, NULL },
7856 { (char *)"PC&X", onSetSnapshotFormat, NULL, 0, NULL },
7857 { (char *)"&TGA", onSetSnapshotFormat, NULL, 0, NULL },
7858 { NULL, NULL, NULL, 0, NULL }
7859 };
7860
7861 static MENU controls_menu[] =
7862 {
7863 { (char *)"Key&board...", onKeyboard, NULL, 0, NULL },
7864 { (char *)"&Gamepad...", onGamepad, NULL, 0, NULL },
7865 { NULL, NULL, NULL, 0, NULL }
7866 };
7867
7868 static MENU name_entry_mode_menu[] =
7869 {
7870 { (char *)"&Keyboard", onKeyboardEntry, NULL, 0, NULL },
7871 { (char *)"&Letter Grid", onLetterGridEntry, NULL, 0, NULL },
7872 { (char *)"&Extended Letter Grid", onExtLetterGridEntry, NULL, 0, NULL },
7873 { NULL, NULL, NULL, 0, NULL }
7874 };
7875
7876 static void set_controls_menu_active()
7877 {
7878
7879 }
7880
7881 static MENU settings_menu[] =
7882 {
7883 { (char *)"&Sound...", onSound, NULL, 0, NULL },
7884 { (char *)"C&ontrols", NULL, controls_menu, 0, NULL },
7885 { (char *)"&Title Screen", NULL, title_menu, 0, NULL },
7886 { (char *)"Name &Entry Mode", NULL, name_entry_mode_menu, 0, NULL },
7887 { (char *)"", NULL, NULL, 0, NULL },
7888 { (char *)"&Cap FPS\tF1", onVsync, NULL, 0, NULL },
7889 { (char *)"Show &FPS\tF2", onShowFPS, NULL, 0, NULL },
7890 { (char *)"Show Trans. &Layers", onTransLayers, NULL, 0, NULL },
7891 { (char *)"Up+A+B To &Quit", onNESquit, NULL, 0, NULL },
7892 { (char *)"Click to Freeze", onClickToFreeze, NULL, 0, NULL },
7893 { (char *)"Autosave Window Size Changes", onSaveDragResize, NULL, 0, NULL },
7894 { (char *)"Lock Aspect Ratio", onDragAspect, NULL, 0, NULL },
7895 { (char *)"Window Position Saving", onWinPosSave, NULL, 0, NULL },
7896 { (char *)"Volume &Keys", onVolKeys, NULL, 0, NULL },
7897 { (char *)"Cont. &Heart Beep", onHeartBeep, NULL, 0, NULL },
7898 { (char *)"Sa&ve Indicator", onSaveIndicator, NULL, 0, NULL },
7899 { (char *)"Epilepsy Flash Reduction", onEpilepsy, NULL, 0, NULL },
7900 { (char *)"S&napshot Format", NULL, snapshot_format_menu, 0, NULL },
7901 { (char *)"", NULL, NULL, 0, NULL },
7902 { (char *)"Debu&g", onDebug, NULL, 0, NULL },
7903 { (char *)"", NULL, NULL, 0, NULL },
7904 { NULL, NULL, NULL, 0, NULL }
7905 };
7906
7907
7908 static MENU misc_menu[] =
7909 {
7910 { (char *)"&About...", onAbout, NULL, 0, NULL },
7911 { (char *)"&Credits...", onCredits, NULL, 0, NULL },
7912 { (char *)"&Fullscreen", onFullscreenMenu, NULL, 0, NULL },
7913 { (char *)"&Video Mode...", onVidMode, NULL, 0, NULL },
7914 { (char *)"", NULL, NULL, 0, NULL },
7915 //5
7916 { (char *)"&Quest Info...", onQuest, NULL, 0, NULL },
7917 { (char *)"Quest &MIDI Info...", onMIDICredits, NULL, 0, NULL },
7918 { (char *)"Quest &Directory...", onQstPath, NULL, 0, NULL },
7919 { (char *)"", NULL, NULL, 0, NULL },
7920 { (char *)"Take &Snapshot\tF12", onSnapshot, NULL, 0, NULL },
7921 //10
7922 { (char *)"Sc&reen Saver...", onScreenSaver, NULL, 0, NULL },
7923 { (char *)"Save ZC Configuration", OnSaveZCConfig, NULL, 0, NULL },
7924 { (char *)"Show ZASM Debugger", onConsoleZASM, NULL, 0, NULL },
7925 { (char *)"Show ZScript Debugger", onConsoleZScript, NULL, 0, NULL },
7926 { (char *)"Clear Console on Qst Load", onClrConsoleOnLoad, NULL, 0, NULL },
7927 //15
7928 { (char *)"Clear Directory Cache", OnnClearQuestDir, NULL, 0, NULL },
7929 { (char *)"Modules", NULL, zcmodule_menu, 0, NULL },
7930 { (char *)"Replay", NULL, replay_menu, 0, NULL },
7931
7932 { NULL, NULL, NULL, 0, NULL }
7933 };
7934
7935 static MENU refill_menu[] =
7936 {
7937 { (char *)"&Life\t*, H", onRefillLife, NULL, 0, NULL },
7938 { (char *)"&Magic\t/, M", onRefillMagic, NULL, 0, NULL },
7939 { (char *)"&Bombs\tB", onCheatBombs, NULL, 0, NULL },
7940 { (char *)"&Rupees\tR", onCheatRupies, NULL, 0, NULL },
7941 { (char *)"&Arrows\tA", onCheatArrows, NULL, 0, NULL },
7942 { NULL, NULL, NULL, 0, NULL }
7943 };
7944
7945 static MENU show_menu[] =
7946 {
7947 { (char *)"Combos\t0", onShowLayer0, NULL, 0, NULL },
7948 { (char *)"Layer 1\t1", onShowLayer1, NULL, 0, NULL },
7949 { (char *)"Layer 2\t2", onShowLayer2, NULL, 0, NULL },
7950 { (char *)"Layer 3\t3", onShowLayer3, NULL, 0, NULL },
7951 { (char *)"Layer 4\t4", onShowLayer4, NULL, 0, NULL },
7952 { (char *)"Layer 5\t5", onShowLayer5, NULL, 0, NULL },
7953 { (char *)"Layer 6\t6", onShowLayer6, NULL, 0, NULL },
7954 { (char *)"Overhead Combos\tO", onShowLayerO, NULL, 0, NULL },
7955 { (char *)"Push Blocks\tP", onShowLayerP, NULL, 0, NULL },
7956 { (char *)"Freeform Combos\t7", onShowLayerF, NULL, 0, NULL },
7957 { (char *)"Sprites\t8", onShowLayerS, NULL, 0, NULL },
7958 { (char *)"", NULL, NULL, 0, NULL },
7959 { (char *)"Walkability\tW", onShowLayerW, NULL, 0, NULL },
7960 { (char *)"Current FFC Scripts\tF", onShowFFScripts, NULL, 0, NULL },
7961 { (char *)"Hitboxes\tC", onShowHitboxes, NULL, 0, NULL },
7962 { (char *)"Effects\tE", onShowLayerE, NULL, 0, NULL },
7963 { NULL, NULL, NULL, 0, NULL }
7964 };
7965
7966 static MENU cheat_menu[] =
7967 {
7968 { (char *)"S&et Cheat", onCheat, NULL, 0, NULL },
7969 { (char *)"", NULL, NULL, 0, NULL },
7970 { (char *)"Re&fill", NULL, refill_menu, 0, NULL },
7971 { (char *)"", NULL, NULL, 0, NULL },
7972 { (char *)"&Clock\tI", onClock, NULL, 0, NULL },
7973 { (char *)"Ma&x Bombs...", onMaxBombs, NULL, 0, NULL },
7974 { (char *)"&Heart Containers...", onHeartC, NULL, 0, NULL },
7975 { (char *)"&Magic Containers...", onMagicC, NULL, 0, NULL },
7976 { (char *)"", NULL, NULL, 0, NULL },
7977 { (char *)"&Player Data...", onCheatConsole, NULL, 0, NULL },
7978 { (char *)"", NULL, NULL, 0, NULL },
7979 { (char *)"Walk Through &Walls\tF11", onNoWalls, NULL, 0, NULL },
7980 { (char *)"Player Ignores Side&view\tV", onIgnoreSideview, NULL, 0, NULL },
7981 { (char *)"&Quick Movement\tQ", onGoFast, NULL, 0, NULL },
7982 { (char *)"&Kill All Enemies\tK", onKillCheat, NULL, 0, NULL },
7983 { (char *)"Show/Hide Layer", NULL, show_menu, 0, NULL },
7984 { (char *)"Toggle Light\tL", onLightSwitch, NULL, 0, NULL },
7985 { (char *)"&Goto Location...\tG", onGoTo, NULL, 0, NULL },
7986 { NULL, NULL, NULL, 0, NULL }
7987 };
7988
7989 static MENU fixes_menu[] =
7990 {
7991 { (char *)"Windows MIDI Patch", onMIDIPatch, NULL, 0, NULL },
7992 { NULL, NULL, NULL, 0, NULL }
7993 };
7994
7995 #if DEVLEVEL > 0
7996 int32_t devLogging();
7997 int32_t devDebug();
7998 int32_t devTimestmp();
7999 #if DEVLEVEL > 1
8000 int32_t setCheat();
8001 #endif //DEVLEVEL > 1
8002 enum
8003 {
8004 dv_log,
8005 // dv_dbg,
8006 dv_tmpstmp,
8007 #if DEVLEVEL > 1
8008 dv_nil,
8009 dv_setcheat,
8010 #endif //DEVLEVEL > 1
8011 dv_max
8012 };
8013 static MENU dev_menu[] =
8014 {
8015 { (char *)"&Force Error Log", devLogging, NULL, 0, NULL },
8016 // { (char *)"&Extra Debug Log", devDebug, NULL, 0, NULL },
8017 { (char *)"&Timestamp Log", devTimestmp, NULL, 0, NULL },
8018 #if DEVLEVEL > 1
8019 { (char *)"", NULL, NULL, 0, NULL },
8020 { (char *)"Set &Cheat", setCheat, NULL, 0, NULL },
8021 #endif //DEVLEVEL > 1
8022 { NULL, NULL, NULL, 0, NULL }
8023 };
8024 int32_t devLogging()
8025 {
8026 dev_logging = !dev_logging;
8027 dev_menu[dv_log].flags = dev_logging ? D_SELECTED : 0;
8028 return D_O_K;
8029 }
8030 // int32_t devDebug()
8031 // {
8032 // dev_debug = !dev_debug;
8033 // dev_menu[dv_dbg].flags = dev_debug ? D_SELECTED : 0;
8034 // return D_O_K;
8035 // }
8036 int32_t devTimestmp()
8037 {
8038 dev_timestmp = !dev_timestmp;
8039 dev_menu[dv_tmpstmp].flags = dev_timestmp ? D_SELECTED : 0;
8040 return D_O_K;
8041 }
8042 #if DEVLEVEL > 1
8043 int32_t setCheat()
8044 {
8045 cheat = (vbound(getnumber("Cheat Level",cheat), 0, 4));
8046 return D_O_K;
8047 }
8048 #endif //DEVLEVEL > 1
8049 #endif //DEVLEVEL > 0
8050
8051 MENU the_player_menu[] =
8052 {
8053 { (char *)"&Game", NULL, game_menu, 0, NULL },
8054 { (char *)"&Settings", NULL, settings_menu, 0, NULL },
8055 { (char *)"&Cheat", NULL, cheat_menu, 0, NULL },
8056 { (char *)"&Fixes", NULL, fixes_menu, 0, NULL },
8057 { (char *)"&ZC", NULL, misc_menu, 0, NULL },
8058 #if DEVLEVEL > 0
8059 { (char *)"&Dev", NULL, dev_menu, 0, NULL },
8060 #endif
8061 { NULL, NULL, NULL, 0, NULL }
8062 };
8063
8064 MENU the_player_menu2[] =
8065 {
8066 { (char *)"&Game", NULL, game_menu, 0, NULL },
8067 { (char *)"&Settings", NULL, settings_menu, 0, NULL },
8068 { (char *)"&Fixes", NULL, fixes_menu, 0, NULL },
8069 { (char *)"&ZC", NULL, misc_menu, 0, NULL },
8070 #if DEVLEVEL > 0
8071 { (char *)"&Dev", NULL, dev_menu, 0, NULL },
8072 #endif
8073 { NULL, NULL, NULL, 0, NULL }
8074 };
8075
8076 int32_t onMIDIPatch()
8077 {
8078 if(jwin_alert3(
8079 "Toggle Windows MIDI Fix",
8080 "This action will change whether ZC Player auto-restarts a MIDI at its",
8081 "last index if you move ZC Player out of focus, then back into focus.",
8082 "Proceed?",
8083 "&Yes",
8084 "&No",
8085 NULL,
8086 'y',
8087 'n',
8088 0,
8089 lfont) == 1)
8090 {
8091 midi_patch_fix = midi_patch_fix ? 0 : 1;
8092 zc_set_config("zeldadx","midi_patch_fix",midi_patch_fix);
8093 }
8094 fixes_menu[0].flags =(midi_patch_fix)?D_SELECTED:0;
8095 return D_O_K;
8096 }
8097
8098 int32_t onKeyboardEntry()
8099 {
8100 NameEntryMode=0;
8101 zc_set_config(cfg_sect,"name_entry_mode",NameEntryMode);
8102 return D_O_K;
8103 }
8104
8105 int32_t onLetterGridEntry()
8106 {
8107 NameEntryMode=1;
8108 zc_set_config(cfg_sect,"name_entry_mode",NameEntryMode);
8109 return D_O_K;
8110 }
8111
8112 int32_t onExtLetterGridEntry()
8113 {
8114 NameEntryMode=2;
8115 zc_set_config(cfg_sect,"name_entry_mode",NameEntryMode);
8116 return D_O_K;
8117 }
8118
8119 static BITMAP* oldscreen;
8120 int32_t onFullscreenMenu()
8121 {
8122 // super hacks
8123 screen = oldscreen;
8124 if (onFullscreen() == D_REDRAW)
8125 {
8126 oldscreen = screen;
8127 }
8128 screen = menu_bmp;
8129 misc_menu[2].flags =(isFullScreen()==1)?D_SELECTED:0;
8130 return D_O_K;
8131 }
8132
8133 13 void fix_menu()
8134 {
8135
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if(!debug_enabled)
8136 13 settings_menu[18].text = NULL;
8137 13 }
8138
8139 static DIALOG system_dlg[] =
8140 {
8141 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) */
8142 { jwin_menu_proc, 0, 0, 0, 0, 0, 0, 0, D_USER, 0, 0, (void *) the_player_menu, NULL, NULL },
8143 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F1, 0, (void *) onVsync, NULL, NULL },
8144 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F2, 0, (void *) onShowFPS, NULL, NULL },
8145 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F6, 0, (void *) onTryQuitMenu, NULL, NULL },
8146 #ifndef ALLEGRO_MACOSX
8147 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F9, 0, (void *) onReset, NULL, NULL },
8148 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F10, 0, (void *) onExit, NULL, NULL },
8149 #else
8150 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F7, 0, (void *) onReset, NULL, NULL },
8151 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F8, 0, (void *) onExit, NULL, NULL },
8152 #endif
8153 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F12, 0, (void *) onSnapshot, NULL, NULL },
8154 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_TAB, 0, (void *) onDebug, NULL, NULL },
8155 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
8156 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
8157 };
8158
8159 static DIALOG system_dlg2[] =
8160 {
8161 /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) */
8162 { jwin_menu_proc, 0, 0, 0, 0, 0, 0, 0, D_USER, 0, 0, (void *) the_player_menu2, NULL, NULL },
8163 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F1, 0, (void *) onVsync, NULL, NULL },
8164 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F2, 0, (void *) onShowFPS, NULL, NULL },
8165 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F6, 0, (void *) onTryQuitMenu, NULL, NULL },
8166 #ifndef ALLEGRO_MACOSX
8167 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F9, 0, (void *) onReset, NULL, NULL },
8168 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F10, 0, (void *) onExit, NULL, NULL },
8169 #else
8170 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F7, 0, (void *) onReset, NULL, NULL },
8171 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F8, 0, (void *) onExit, NULL, NULL },
8172 #endif
8173 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F12, 0, (void *) onSnapshot, NULL, NULL },
8174 { d_keyboard_proc, 0, 0, 0, 0, 0, 0, 0, 0, KEY_TAB, 0, (void *) onDebug, NULL, NULL },
8175 { d_timer_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
8176 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
8177 };
8178
8179 void reset_snapshot_format_menu()
8180 {
8181 for(int32_t i=0; i<ssfmtMAX; ++i)
8182 {
8183 snapshot_format_menu[i].flags=0;
8184 }
8185 }
8186
8187 int32_t onSetSnapshotFormat()
8188 {
8189 switch(active_menu->text[1])
8190 {
8191 case 'B': //"&BMP"
8192 SnapshotFormat=0;
8193 break;
8194
8195 case 'G': //"&GIF"
8196 SnapshotFormat=1;
8197 break;
8198
8199 case 'J': //"&JPG"
8200 SnapshotFormat=2;
8201 break;
8202
8203 case 'P': //"&PNG"
8204 SnapshotFormat=3;
8205 break;
8206
8207 case 'C': //"PC&X"
8208 SnapshotFormat=4;
8209 break;
8210
8211 case 'T': //"&TGA"
8212 SnapshotFormat=5;
8213 break;
8214
8215 case 'L': //"&LBM"
8216 SnapshotFormat=6;
8217 break;
8218 }
8219 zc_set_config("zeldadx", "snapshot_format", SnapshotFormat);
8220
8221 snapshot_format_menu[SnapshotFormat].flags=D_SELECTED;
8222 return D_O_K;
8223 }
8224
8225
8226 27 void color_layer(RGB *src,RGB *dest,char r,char g,char b,char pos,int32_t from,int32_t to)
8227 {
8228 PALETTE tmp;
8229
8230
2/2
✓ Branch 0 taken 6912 times.
✓ Branch 1 taken 27 times.
6939 for(int32_t i=0; i<256; i++)
8231 {
8232 6912 tmp[i].r=r;
8233 6912 tmp[i].g=g;
8234 6912 tmp[i].b=b;
8235 6912 }
8236
8237 27 fade_interpolate(src,tmp,dest,pos,from,to);
8238 27 }
8239
8240 27 void system_pal()
8241 {
8242 27 is_sys_pal = true;
8243 static PALETTE pal;
8244 27 copy_pal((RGB*)datafile[PAL_GUI].dat, pal);
8245
8246 // set up the grayscale palette
8247
2/2
✓ Branch 0 taken 1728 times.
✓ Branch 1 taken 27 times.
1755 for(int32_t i=128; i<192; i++)
8248 {
8249 1728 pal[i].r = i-128;
8250 1728 pal[i].g = i-128;
8251 1728 pal[i].b = i-128;
8252 1728 }
8253 27 load_colorset(gui_colorset, pal);
8254
8255 27 color_layer(pal, pal, 24,16,16, 28, 128,191);
8256
8257
2/2
✓ Branch 0 taken 3456 times.
✓ Branch 1 taken 27 times.
3483 for(int32_t i=0; i<256; i+=2)
8258 {
8259 3456 int32_t v = (i>>3)+2;
8260 3456 int32_t c = (i>>3)+192;
8261 3456 pal[c] = _RGB(v,v,v+(v>>1));
8262 /*
8263 if(i<240)
8264 {
8265 _allegro_hline(tmp_scr,0,i,319,c);
8266 _allegro_hline(tmp_scr,0,i+1,319,c);
8267 }
8268 */
8269 3456 }
8270
8271 // draw the vertical screen gradient
8272
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 27 times.
6507 for(int32_t i=0; i<240; ++i)
8273 {
8274 6480 _allegro_hline(tmp_scr,0,i,319,192+(i*31/239));
8275 6480 }
8276
8277 /*
8278 palrstart= 10*63/255; palrend=166*63/255;
8279 palgstart= 36*63/255; palgend=202*63/255;
8280 palbstart=106*63/255; palbend=240*63/255;
8281 paldivs=32;
8282 for(int32_t i=0; i<paldivs; i++)
8283 {
8284 pal[223-paldivs+1+i].r = palrstart+((palrend-palrstart)*i/(paldivs-1));
8285 pal[223-paldivs+1+i].g = palgstart+((palgend-palgstart)*i/(paldivs-1));
8286 pal[223-paldivs+1+i].b = palbstart+((palbend-palbstart)*i/(paldivs-1));
8287 }
8288 */
8289 27 BITMAP *panorama = create_bitmap_ex(8,256,224);
8290 int32_t ts_height, ts_start;
8291
8292
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
27 if(tmpscr->flags3&fNOSUBSCR && !(tmpscr->flags3&fNOSUBSCROFFSET))
8293 {
8294 clear_to_color(panorama,0);
8295 blit(framebuf,panorama,0,playing_field_offset,0,28,256,224-passive_subscreen_height);
8296 ts_height=224-passive_subscreen_height;
8297 ts_start=28;
8298 }
8299 else
8300 {
8301 27 blit(framebuf,panorama,0,0,0,0,256,224);
8302 27 ts_height=224;
8303 27 ts_start=0;
8304 }
8305
8306 // gray scale the current frame
8307
2/2
✓ Branch 0 taken 6048 times.
✓ Branch 1 taken 27 times.
6075 for(int32_t y=0; y<ts_height; y++)
8308 {
8309
2/2
✓ Branch 0 taken 1548288 times.
✓ Branch 1 taken 6048 times.
1554336 for(int32_t x=0; x<256; x++)
8310 {
8311 1548288 int32_t c = panorama->line[y+ts_start][x];
8312
2/2
✓ Branch 0 taken 1542398 times.
✓ Branch 1 taken 5890 times.
1548288 int32_t gray = zc_min((RAMpal[c].r*42 + RAMpal[c].g*75 + RAMpal[c].b*14) >> 7, 63);
8313 1548288 tmp_scr->line[y+8+ts_start][x+32] = gray+128;
8314 1548288 }
8315 6048 }
8316
8317 27 destroy_bitmap(panorama);
8318
8319 // display everything
8320 27 vsync();
8321 27 hw_palette = &pal;
8322 27 update_hw_pal = true;
8323
8324 // sys_pal = pal;
8325 27 memcpy(sys_pal,pal,sizeof(pal));
8326 27 }
8327
8328 void system_pal2()
8329 {
8330 is_sys_pal = true;
8331 static PALETTE RAMpal2;
8332 copy_pal((RGB*)datafile[PAL_GUI].dat, RAMpal2);
8333
8334 /* Windows 2000 colors
8335 RAMpal2[dvc(1)] = _RGB( 0*63/255, 0*63/255, 0*63/255);
8336 RAMpal2[dvc(2)] = _RGB( 66*63/255, 65*63/255, 66*63/255);
8337 RAMpal2[dvc(3)] = _RGB(132*63/255, 130*63/255, 132*63/255);
8338 RAMpal2[dvc(4)] = _RGB(212*63/255, 208*63/255, 200*63/255);
8339 RAMpal2[dvc(5)] = _RGB(255*63/255, 255*63/255, 255*63/255);
8340 RAMpal2[dvc(6)] = _RGB(255*63/255, 255*63/255, 225*63/255);
8341 RAMpal2[dvc(7)] = _RGB(255*63/255, 225*63/255, 160*63/255);
8342 RAMpal2[dvc(8)] = _RGB( 0*63/255, 0*63/255, 80*63/255);
8343
8344 byte palrstart= 10*63/255, palrend=166*63/255,
8345 palgstart= 36*63/255, palgend=202*63/255,
8346 palbstart=106*63/255, palbend=240*63/255,
8347 paldivs=7;
8348 for(int32_t i=0; i<paldivs; i++)
8349 {
8350 RAMpal2[dvc(15-paldivs+1)+i].r = palrstart+((palrend-palrstart)*i/(paldivs-1));
8351 RAMpal2[dvc(15-paldivs+1)+i].g = palgstart+((palgend-palgstart)*i/(paldivs-1));
8352 RAMpal2[dvc(15-paldivs+1)+i].b = palbstart+((palbend-palbstart)*i/(paldivs-1));
8353 }
8354 */
8355
8356 /* Windows 98 colors
8357 RAMpal2[dvc(1)] = _RGB( 0*63/255, 0*63/255, 0*63/255);
8358 RAMpal2[dvc(2)] = _RGB(128*63/255, 128*63/255, 128*63/255);
8359 RAMpal2[dvc(3)] = _RGB(192*63/255, 192*63/255, 192*63/255);
8360 RAMpal2[dvc(4)] = _RGB(223*63/255, 223*63/255, 223*63/255);
8361 RAMpal2[dvc(5)] = _RGB(255*63/255, 255*63/255, 255*63/255);
8362 RAMpal2[dvc(6)] = _RGB(255*63/255, 255*63/255, 225*63/255);
8363 RAMpal2[dvc(7)] = _RGB(255*63/255, 225*63/255, 160*63/255);
8364 RAMpal2[dvc(8)] = _RGB( 0*63/255, 0*63/255, 80*63/255);
8365
8366 byte palrstart= 0*63/255, palrend=166*63/255,
8367 palgstart= 0*63/255, palgend=202*63/255,
8368 palbstart=128*63/255, palbend=240*63/255,
8369 paldivs=7;
8370 for(int32_t i=0; i<paldivs; i++)
8371 {
8372 RAMpal2[dvc(15-paldivs+1)+i].r = palrstart+((palrend-palrstart)*i/(paldivs-1));
8373 RAMpal2[dvc(15-paldivs+1)+i].g = palgstart+((palgend-palgstart)*i/(paldivs-1));
8374 RAMpal2[dvc(15-paldivs+1)+i].b = palbstart+((palbend-palbstart)*i/(paldivs-1));
8375 }
8376 */
8377
8378 /* Windows 99 colors
8379 RAMpal2[dvc(1)] = _RGB( 0*63/255, 0*63/255, 0*63/255);
8380 RAMpal2[dvc(2)] = _RGB( 64*63/255, 64*63/255, 64*63/255);
8381 RAMpal2[dvc(3)] = _RGB(128*63/255, 128*63/255, 128*63/255);
8382 RAMpal2[dvc(4)] = _RGB(192*63/255, 192*63/255, 192*63/255);
8383 RAMpal2[dvc(5)] = _RGB(223*63/255, 223*63/255, 223*63/255);
8384 RAMpal2[dvc(6)] = _RGB(255*63/255, 255*63/255, 255*63/255);
8385 RAMpal2[dvc(7)] = _RGB(255*63/255, 255*63/255, 225*63/255);
8386 RAMpal2[dvc(8)] = _RGB(255*63/255, 225*63/255, 160*63/255);
8387 RAMpal2[dvc(9)] = _RGB( 0*63/255, 0*63/255, 80*63/255);
8388
8389 byte palrstart= 0*63/255, palrend=166*63/255,
8390 palgstart= 0*63/255, palgend=202*63/255,
8391
8392 palbstart=128*63/255, palbend=240*63/255,
8393 paldivs=6;
8394 for(int32_t i=0; i<paldivs; i++)
8395 {
8396 RAMpal2[dvc(15-paldivs+1)+i].r = palrstart+((palrend-palrstart)*i/(paldivs-1));
8397 RAMpal2[dvc(15-paldivs+1)+i].g = palgstart+((palgend-palgstart)*i/(paldivs-1));
8398 RAMpal2[dvc(15-paldivs+1)+i].b = palbstart+((palbend-palbstart)*i/(paldivs-1));
8399 }
8400 */
8401
8402
8403
8404 RAMpal2[dvc(1)] = _RGB(0*63/255, 0*63/255, 0*63/255);
8405 RAMpal2[dvc(2)] = _RGB(64*63/255, 64*63/255, 64*63/255);
8406 RAMpal2[dvc(3)] = _RGB(128*63/255, 128*63/255, 128*63/255);
8407 RAMpal2[dvc(4)] = _RGB(192*63/255, 192*63/255, 192*63/255);
8408 RAMpal2[dvc(5)] = _RGB(223*63/255, 223*63/255, 223*63/255);
8409 RAMpal2[dvc(6)] = _RGB(255*63/255, 255*63/255, 255*63/255);
8410 RAMpal2[dvc(7)] = _RGB(255*63/255, 255*63/255, 225*63/255);
8411 RAMpal2[dvc(8)] = _RGB(255*63/255, 225*63/255, 160*63/255);
8412 RAMpal2[dvc(9)] = _RGB(0*63/255, 0*63/255, 80*63/255);
8413
8414 byte palrstart= 0*63/255, palrend=166*63/255,
8415 palgstart= 0*63/255, palgend=202*63/255,
8416 palbstart=128*63/255, palbend=240*63/255,
8417 paldivs=6;
8418
8419 for(int32_t i=0; i<paldivs; i++)
8420 {
8421 RAMpal2[dvc(15-paldivs+1)+i].r = palrstart+((palrend-palrstart)*i/(paldivs-1));
8422 RAMpal2[dvc(15-paldivs+1)+i].g = palgstart+((palgend-palgstart)*i/(paldivs-1));
8423 RAMpal2[dvc(15-paldivs+1)+i].b = palbstart+((palbend-palbstart)*i/(paldivs-1));
8424 }
8425
8426 gui_bg_color=jwin_pal[jcBOX];
8427 gui_fg_color=jwin_pal[jcBOXFG];
8428
8429 jwin_set_colors(jwin_pal);
8430
8431
8432 // set up the new palette
8433 for(int32_t i=128; i<192; i++)
8434 {
8435 RAMpal2[i].r = i-128;
8436 RAMpal2[i].g = i-128;
8437 RAMpal2[i].b = i-128;
8438 }
8439
8440 /*
8441 for(int32_t i=0; i<64; i++)
8442 {
8443 RAMpal2[128+i] = _RGB(i,i,i)1));
8444 }
8445 */
8446
8447 /*
8448
8449 pal[vc(1)] = _RGB(0x00,0x00,0x14);
8450 pal[vc(4)] = _RGB(0x36,0x36,0x36);
8451 pal[vc(6)] = _RGB(0x10,0x10,0x10);
8452 pal[vc(7)] = _RGB(0x20,0x20,0x20);
8453 pal[vc(9)] = _RGB(0x20,0x20,0x24);
8454 pal[vc(11)] = _RGB(0x30,0x30,0x30);
8455 pal[vc(14)] = _RGB(0x3F,0x38,0x28);
8456
8457 gui_fg_color=vc(14);
8458 gui_bg_color=vc(1);
8459
8460 jwin_set_colors(jwin_pal);
8461 */
8462
8463 // color_layer(RAMpal2, RAMpal2, 24,16,16, 28, 128,191);
8464
8465 // set up the colors for the vertical screen gradient
8466 for(int32_t i=0; i<256; i+=2)
8467 {
8468 int32_t v = (i>>3)+2;
8469 int32_t c = (i>>3)+192;
8470 RAMpal2[c] = _RGB(v,v,v+(v>>1));
8471
8472 /*
8473 if(i<240)
8474 {
8475 _allegro_hline(tmp_scr,0,i,319,c);
8476 _allegro_hline(tmp_scr,0,i+1,319,c);
8477 }
8478 */
8479 }
8480
8481 // hw_palette = &RAMpal;
8482 // update_hw_pal = true;
8483
8484 for(int32_t i=0; i<240; ++i)
8485 {
8486 _allegro_hline(tmp_scr,0,i,319,192+(i*31/239));
8487 }
8488
8489 /*
8490 byte palrstart= 10*63/255, palrend=166*63/255,
8491 palgstart= 36*63/255, palgend=202*63/255,
8492 palbstart=106*63/255, palbend=240*63/255,
8493 paldivs=32;
8494 for(int32_t i=0; i<paldivs; i++)
8495 {
8496 pal[223-paldivs+1+i].r = palrstart+((palrend-palrstart)*i/(paldivs-1));
8497 pal[223-paldivs+1+i].g = palgstart+((palgend-palgstart)*i/(paldivs-1));
8498 pal[223-paldivs+1+i].b = palbstart+((palbend-palbstart)*i/(paldivs-1));
8499 }
8500 */
8501 BITMAP *panorama = create_bitmap_ex(8,256,224);
8502 int32_t ts_height, ts_start;
8503
8504 if(tmpscr->flags3&fNOSUBSCR && !(tmpscr->flags3&fNOSUBSCROFFSET))
8505 {
8506 clear_to_color(panorama,0);
8507 blit(framebuf,panorama,0,playing_field_offset,0,28,256,224-passive_subscreen_height);
8508 ts_height=224-passive_subscreen_height;
8509 ts_start=28;
8510 }
8511 else
8512 {
8513 blit(framebuf,panorama,0,0,0,0,256,224);
8514 ts_height=224;
8515 ts_start=0;
8516 }
8517
8518 // gray scale the current frame
8519 for(int32_t y=0; y<ts_height; y++)
8520 {
8521 for(int32_t x=0; x<256; x++)
8522 {
8523 int32_t c = panorama->line[y+ts_start][x];
8524 int32_t gray = zc_min((RAMpal2[c].r*42 + RAMpal2[c].g*75 + RAMpal2[c].b*14) >> 7, 63);
8525 tmp_scr->line[y+8+ts_start][x+32] = gray+128;
8526 }
8527 }
8528
8529 destroy_bitmap(panorama);
8530
8531 // display everything
8532 vsync();
8533 hw_palette = &RAMpal2;
8534 update_hw_pal = true;
8535
8536 blit(tmp_scr,screen,0,0,scrx,scry,320,240);
8537
8538 // sys_pal = pal;
8539 memcpy(sys_pal,RAMpal2,sizeof(RAMpal2));
8540 }
8541
8542 static uint32_t entered_sys_pal = 0;
8543 14 void enter_sys_pal()
8544 {
8545
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if(is_sys_pal)
8546 {
8547 if(entered_sys_pal)
8548 ++entered_sys_pal;
8549 return;
8550 }
8551 14 system_pal();
8552 14 ++entered_sys_pal;
8553 14 }
8554 14 void exit_sys_pal()
8555 {
8556
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if(entered_sys_pal)
8557 {
8558
1/2
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
14 if(!--entered_sys_pal)
8559 {
8560 14 game_pal();
8561 14 }
8562 14 }
8563 14 }
8564
8565 void switch_out_callback()
8566 {
8567 if (pause_in_background)
8568 {
8569 callback_switchin = 3;
8570 return;
8571 }
8572
8573 #ifdef _WIN32
8574 if(midi_patch_fix==0 || currmidi==-1)
8575 return;
8576
8577
8578 paused_midi_pos = midi_pos;
8579 zc_stop_midi();
8580 midi_paused=true;
8581 midi_suspended = midissuspHALTED;
8582 #endif
8583 }
8584
8585 void switch_in_callback()
8586 {
8587 if(pause_in_background)
8588 {
8589 return;
8590 }
8591
8592 #ifdef _WIN32
8593 if(midi_patch_fix==0 || currmidi==-1)
8594 return;
8595
8596 else
8597 {
8598 callback_switchin = 1;
8599 midi_suspended = midissuspRESUME;
8600 }
8601 #endif
8602 }
8603
8604 123 void game_pal()
8605 {
8606 123 is_sys_pal = false;
8607 123 entered_sys_pal = 0;
8608 123 clear_to_color(screen,BLACK);
8609 123 hw_palette = &RAMpal;
8610 123 update_hw_pal = true;
8611 123 }
8612
8613 static char bar_str[] = "";
8614
8615 14 void music_pause()
8616 {
8617 //al_pause_duh(tmplayer);
8618 14 zcmusic_pause(zcmusic, ZCM_PAUSE);
8619 14 zc_midi_pause();
8620 14 midi_paused=true;
8621 14 }
8622
8623 void music_resume()
8624 {
8625 //al_resume_duh(tmplayer);
8626 zcmusic_pause(zcmusic, ZCM_RESUME);
8627 zc_midi_resume();
8628 midi_paused=false;
8629 }
8630
8631 1997 void music_stop()
8632 {
8633 //al_stop_duh(tmplayer);
8634 //unload_duh(tmusic);
8635 //tmusic=NULL;
8636 //tmplayer=NULL;
8637 1997 zcmusic_stop(zcmusic);
8638 1997 zcmusic_unload_file(zcmusic);
8639 1997 zc_stop_midi();
8640 1997 midi_paused=false;
8641 1997 currmidi=-1;
8642 1997 }
8643
8644 void System()
8645 {
8646 mouse_down=gui_mouse_b();
8647 music_pause();
8648 pause_all_sfx();
8649 MenuOpen = true;
8650 system_pal();
8651 // FONT *oldfont=font;
8652 // font=tfont;
8653
8654 misc_menu[2].flags =(isFullScreen()==1)?D_SELECTED:0;
8655 misc_menu[3].flags =(isFullScreen()==1)?D_DISABLED:0;
8656
8657 game_menu[2].flags = getsaveslot() > -1 ? 0 : D_DISABLED;
8658 #if DEVLEVEL > 1
8659 dev_menu[dv_setcheat].flags = Playing ? 0 : D_DISABLED;
8660 #endif
8661 game_menu[3].flags =
8662 misc_menu[5].flags = Playing ? 0 : D_DISABLED;
8663 misc_menu[7].flags = !Playing ? 0 : D_DISABLED;
8664 fixes_menu[0].flags = (midi_patch_fix)?D_SELECTED:0;
8665 clear_keybuf();
8666 show_mouse(screen);
8667
8668 DIALOG_PLAYER *p;
8669
8670 clear_bitmap(menu_bmp);
8671 oldscreen = screen;
8672 screen = menu_bmp;
8673
8674 if(!Playing || (!zcheats.flags && !get_debug() && DEVLEVEL < 2 && !zqtesting_mode))
8675 {
8676 p = init_dialog(system_dlg2,-1);
8677 }
8678 else
8679 {
8680 p = init_dialog(system_dlg,-1);
8681 }
8682
8683 // drop the menu on startup if menu button pressed
8684 if(joybtn(Mbtn)||zc_getrawkey(KEY_ESC))
8685 simulate_keypress(KEY_G << 8);
8686
8687 do
8688 {
8689 if(close_button_quit)
8690 {
8691 close_button_quit = false;
8692 f_Quit(qEXIT);
8693 if(Quit) break;
8694 }
8695 rest(17);
8696
8697 if(mouse_down && !gui_mouse_b())
8698 mouse_down=0;
8699
8700 title_menu[0].flags = (title_version==0) ? D_SELECTED : 0;
8701 title_menu[1].flags = (title_version==1) ? D_SELECTED : 0;
8702 title_menu[2].flags = (title_version==2) ? D_SELECTED : 0;
8703
8704 settings_menu[1].flags = replay_is_replaying() ? D_DISABLED : 0;
8705 settings_menu[5].flags = Throttlefps?D_SELECTED:0;
8706 settings_menu[6].flags = ShowFPS?D_SELECTED:0;
8707 settings_menu[7].flags = TransLayers?D_SELECTED:0;
8708 settings_menu[8].flags = NESquit?D_SELECTED:0;
8709 settings_menu[9].flags = ClickToFreeze?D_SELECTED:0;
8710 settings_menu[10].flags = SaveDragResize?D_SELECTED:0;
8711 settings_menu[11].flags = DragAspect?D_SELECTED:0;
8712 settings_menu[12].flags = SaveWinPos?D_SELECTED:0;
8713 settings_menu[13].flags = volkeys?D_SELECTED:0;
8714 //Epilepsy Prevention
8715 settings_menu[16].flags = (epilepsyFlashReduction) ? D_SELECTED : 0;
8716
8717 name_entry_mode_menu[0].flags = (NameEntryMode==0)?D_SELECTED:0;
8718 name_entry_mode_menu[1].flags = (NameEntryMode==1)?D_SELECTED:0;
8719 name_entry_mode_menu[2].flags = (NameEntryMode==2)?D_SELECTED:0;
8720
8721 misc_menu[12].flags =(zasm_debugger)?D_SELECTED:0;
8722 misc_menu[13].flags =(zscript_debugger)?D_SELECTED:0;
8723 misc_menu[14].flags =(clearConsoleOnLoad)?D_SELECTED:0;
8724
8725 the_player_menu[2].flags = replay_is_replaying() ? D_DISABLED : 0;
8726 cheat_menu[0].flags = 0;
8727 refill_menu[4].flags = get_bit(quest_rules, qr_TRUEARROWS) ? 0 : D_DISABLED;
8728 cheat_menu[1].text = (cheat >= 1) || get_debug() ? bar_str : NULL;
8729 cheat_menu[3].text = (cheat >= 2) || get_debug() ? bar_str : NULL;
8730 cheat_menu[8].text = (cheat >= 3) || get_debug() ? bar_str : NULL;
8731 cheat_menu[10].text = (cheat >= 4) || get_debug() ? bar_str : NULL;
8732 cheat_menu[4].flags = getClock() ? D_SELECTED : 0;
8733 cheat_menu[11].flags = toogam ? D_SELECTED : 0;
8734 cheat_menu[12].flags = ignoreSideview ? D_SELECTED : 0;
8735 cheat_menu[13].flags = gofast ? D_SELECTED : 0;
8736
8737 show_menu[0].flags = show_layer_0 ? D_SELECTED : 0;
8738 show_menu[1].flags = show_layer_1 ? D_SELECTED : 0;
8739 show_menu[2].flags = show_layer_2 ? D_SELECTED : 0;
8740 show_menu[3].flags = show_layer_3 ? D_SELECTED : 0;
8741 show_menu[4].flags = show_layer_4 ? D_SELECTED : 0;
8742 show_menu[5].flags = show_layer_5 ? D_SELECTED : 0;
8743 show_menu[6].flags = show_layer_6 ? D_SELECTED : 0;
8744 show_menu[7].flags = show_layer_over ? D_SELECTED : 0;
8745 show_menu[8].flags = show_layer_push ? D_SELECTED : 0;
8746 show_menu[9].flags = show_sprites ? D_SELECTED : 0;
8747 show_menu[10].flags = show_ffcs ? D_SELECTED : 0;
8748 show_menu[12].flags = show_walkflags ? D_SELECTED : 0;
8749 show_menu[13].flags = show_ff_scripts ? D_SELECTED : 0;
8750 show_menu[14].flags = show_hitboxes ? D_SELECTED : 0;
8751 show_menu[15].flags = show_effectflags ? D_SELECTED : 0;
8752
8753 settings_menu[14].flags = heart_beep ? D_SELECTED : 0;
8754 settings_menu[15].flags = use_save_indicator ? D_SELECTED : 0;
8755
8756 replay_menu[0].text = zc_get_config("zeldadx", "replay_new_saves", false) ?
8757 (char *)"Disable recording new saves" :
8758 (char *)"Enable recording new saves";
8759 replay_menu[1].flags = replay_is_active() ? 0 : D_DISABLED;
8760 replay_menu[1].text = replay_get_mode() == ReplayMode::Record ?
8761 (char *)"Stop recording" :
8762 (char *)"Stop replaying";
8763 replay_menu[5].flags = replay_get_mode() == ReplayMode::Record ? 0 : D_DISABLED;
8764 replay_menu[6].text = replay_is_snapshot_all_frames() ?
8765 (char *)"Disable snapshot all frames" :
8766 (char *)"Enable snapshot all frames";
8767
8768 reset_snapshot_format_menu();
8769 snapshot_format_menu[SnapshotFormat].flags = D_SELECTED;
8770
8771 if(debug_enabled)
8772 {
8773 settings_menu[19].flags = get_debug() ? D_SELECTED : 0;
8774 }
8775
8776 if(gui_mouse_b() && !mouse_down)
8777 break;
8778
8779 // press menu to drop the menu
8780 if(rMbtn())
8781 simulate_keypress(KEY_G << 8);
8782
8783 if(input_idle(true) > after_time())
8784 // run Screeen Saver
8785 {
8786 // Screen saver enabled for now.
8787 clear_keybuf();
8788 scare_mouse();
8789 Matrix(ss_speed, ss_density, 0);
8790 system_pal();
8791 unscare_mouse();
8792 broadcast_dialog_message(MSG_DRAW, 0);
8793 }
8794
8795 update_hw_screen();
8796 }
8797 while(update_dialog(p));
8798
8799 screen = oldscreen;
8800
8801 // font=oldfont;
8802 mouse_down=gui_mouse_b();
8803 shutdown_dialog(p);
8804 show_mouse(NULL);
8805 MenuOpen = false;
8806 if(Quit)
8807 {
8808 kill_sfx();
8809 music_stop();
8810 update_hw_screen();
8811 }
8812 else
8813 {
8814 game_pal();
8815 music_resume();
8816 resume_all_sfx();
8817
8818 if(rc)
8819 ringcolor(false);
8820 }
8821
8822 eat_buttons();
8823
8824 rc=false;
8825 clear_keybuf();
8826 // text_mode(0);
8827 }
8828
8829 13 void fix_dialogs()
8830 {
8831 13 jwin_center_dialog(about_dlg);
8832 13 jwin_center_dialog(gamepad_dlg);
8833 13 jwin_center_dialog(credits_dlg);
8834 13 jwin_center_dialog(gamemode_dlg);
8835 13 jwin_center_dialog(getnum_dlg);
8836 13 jwin_center_dialog(goto_dlg);
8837 13 jwin_center_dialog(keyboard_control_dlg);
8838 13 jwin_center_dialog(midi_dlg);
8839 13 jwin_center_dialog(quest_dlg);
8840 13 jwin_center_dialog(scrsaver_dlg);
8841 13 jwin_center_dialog(sound_dlg);
8842 13 jwin_center_dialog(triforce_dlg);
8843
8844 // digi_dp[1] += scrx;
8845 // digi_dp[2] += scry;
8846 // midi_dp[1] += scrx;
8847 // midi_dp[2] += scry;
8848 // pan_dp[1] += scrx;
8849 // pan_dp[2] += scry;
8850 // emus_dp[1] += scrx;
8851 // emus_dp[2] += scry;
8852 // buf_dp[1] += scrx;
8853 // buf_dp[2] += scry;
8854 // sfx_dp[1] += scrx;
8855 // sfx_dp[2] += scry;
8856 13 }
8857
8858 /*****************************/
8859 /**** Custom Sound System ****/
8860 /*****************************/
8861
8862 777 INLINE int32_t mixvol(int32_t v1,int32_t v2)
8863 {
8864
3/4
✓ Branch 0 taken 719 times.
✓ Branch 1 taken 58 times.
✓ Branch 2 taken 777 times.
✗ Branch 3 not taken.
777 return (zc_min(v1,255)*zc_min(v2,255)) >> 8;
8865 }
8866
8867 // Run an NSF, or a MIDI if the NSF is missing somehow.
8868 46 bool try_zcmusic(char *filename, int32_t track, int32_t midi)
8869 {
8870 46 ZCMUSIC *newzcmusic = zcmusic_load_for_quest(filename, qstpath);
8871
8872 // Found it
8873
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 20 times.
46 if(newzcmusic!=NULL)
8874 {
8875 26 zcmusic_stop(zcmusic);
8876 26 zcmusic_unload_file(zcmusic);
8877 26 zc_stop_midi();
8878
8879 26 zcmusic=newzcmusic;
8880 26 zcmusic_play(zcmusic, emusic_volume);
8881
8882
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
26 if(track>0)
8883 26 zcmusic_change_track(zcmusic,track);
8884
8885 26 return true;
8886 }
8887
8888 // Not found, play MIDI - unless this was called by a script (yay, magic numbers)
8889
1/2
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
20 else if(midi>-1000)
8890 jukebox(midi);
8891
8892 20 return false;
8893 46 }
8894
8895 bool try_zcmusic_ex(char *filename, int32_t track, int32_t midi)
8896 {
8897 ZCMUSIC *newzcmusic = zcmusic_load_for_quest(filename, qstpath);
8898 // Found it
8899 if(newzcmusic!=NULL)
8900 {
8901 zcmusic_stop(zcmusic);
8902 zcmusic_unload_file(zcmusic);
8903 zc_stop_midi();
8904
8905 zcmusic=newzcmusic;
8906 zcmusic_play(zcmusic, emusic_volume);
8907
8908 if(track>0)
8909 zcmusic_change_track(zcmusic,track);
8910
8911 return true;
8912 }
8913
8914 // Not found, play MIDI - unless this was called by a script (yay, magic numbers)
8915 else if(midi>-1000)
8916 jukebox(midi);
8917
8918 return false;
8919 }
8920
8921 int32_t get_zcmusicpos()
8922 {
8923 int32_t debugtracething = zcmusic_get_curpos(zcmusic);
8924 return debugtracething;
8925 return 0;
8926 }
8927
8928 void set_zcmusicpos(int32_t position)
8929 {
8930 zcmusic_set_curpos(zcmusic, position);
8931 }
8932
8933 void set_zcmusicspeed(int32_t speed)
8934 {
8935 int32_t newspeed = vbound(speed, 0, 10000);
8936 zcmusic_set_speed(zcmusic, newspeed);
8937 }
8938
8939 382 void jukebox(int32_t index,int32_t loop)
8940 {
8941 382 music_stop();
8942
8943
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 382 times.
382 if(index<0) index=MAXMIDIS-1;
8944
8945
1/2
✓ Branch 0 taken 382 times.
✗ Branch 1 not taken.
382 if(index>=MAXMIDIS) index=0;
8946
8947 382 music_stop();
8948
8949 // Allegro's DIGMID driver (the one normally used on on Linux) gets
8950 // stuck notes when a song stops. This fixes it.
8951
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 382 times.
382 if(strcmp(midi_driver->name, "DIGMID")==0)
8952 zc_set_volume(0, 0);
8953
8954 382 zc_set_volume(-1, mixvol(tunes[index].volume,midi_volume>>1));
8955 382 zc_play_midi((MIDI*)tunes[index].data,loop);
8956
8957
2/2
✓ Branch 0 taken 246 times.
✓ Branch 1 taken 136 times.
382 if(tunes[index].start>0)
8958 136 zc_midi_seek(tunes[index].start);
8959
8960 382 midi_loop_start = tunes[index].loop_start;
8961 382 midi_loop_end = tunes[index].loop_end;
8962
8963 382 currmidi=index;
8964 382 master_volume(digi_volume,midi_volume);
8965 382 midi_paused=false;
8966 382 }
8967
8968 2277 void jukebox(int32_t index)
8969 {
8970
1/2
✓ Branch 0 taken 2277 times.
✗ Branch 1 not taken.
2277 if(index<0) index=MAXMIDIS-1;
8971
8972
1/2
✓ Branch 0 taken 2277 times.
✗ Branch 1 not taken.
2277 if(index>=MAXMIDIS) index=0;
8973
8974 // do nothing if it's already playing
8975
3/4
✓ Branch 0 taken 1895 times.
✓ Branch 1 taken 382 times.
✓ Branch 2 taken 1895 times.
✗ Branch 3 not taken.
2277 if(index==currmidi && midi_pos>=0)
8976 {
8977 1895 midi_paused=false;
8978 1895 return;
8979 }
8980
8981 382 jukebox(index,tunes[index].loop);
8982 2277 }
8983
8984 2932 void play_DmapMusic()
8985 {
8986 static char tfile[2048];
8987 static int32_t ttrack=0;
8988 2932 bool domidi=false;
8989
8990
2/2
✓ Branch 0 taken 753 times.
✓ Branch 1 taken 2179 times.
2932 if(DMaps[currdmap].tmusic[0]!=0)
8991 {
8992
3/4
✓ Branch 0 taken 385 times.
✓ Branch 1 taken 368 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 385 times.
1138 if(zcmusic==NULL ||
8993
1/2
✓ Branch 0 taken 385 times.
✗ Branch 1 not taken.
385 strcmp(zcmusic->filename,DMaps[currdmap].tmusic)!=0 ||
8994
1/2
✓ Branch 0 taken 385 times.
✗ Branch 1 not taken.
385 (zcmusic->type==ZCMF_GME && zcmusic->track != DMaps[currdmap].tmusictrack))
8995 {
8996
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 368 times.
368 if(zcmusic != NULL)
8997 {
8998 zcmusic_stop(zcmusic);
8999 zcmusic_unload_file(zcmusic);
9000 zcmusic = NULL;
9001 }
9002
9003 368 zcmusic = zcmusic_load_for_quest(DMaps[currdmap].tmusic, qstpath);
9004
9005
2/2
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 282 times.
368 if(zcmusic!=NULL)
9006 {
9007 86 zc_stop_midi();
9008 86 strcpy(tfile,DMaps[currdmap].tmusic);
9009 86 zcmusic_play(zcmusic, emusic_volume);
9010 86 int32_t temptracks=0;
9011 86 temptracks=zcmusic_get_tracks(zcmusic);
9012
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 temptracks=(temptracks<2)?1:temptracks;
9013 86 ttrack = vbound(DMaps[currdmap].tmusictrack,0,temptracks-1);
9014 86 zcmusic_change_track(zcmusic,ttrack);
9015 86 }
9016 else
9017 {
9018 282 tfile[0] = 0;
9019 282 domidi=true;
9020 }
9021 368 }
9022 753 }
9023 else
9024 {
9025 2179 domidi=true;
9026 }
9027
9028
2/2
✓ Branch 0 taken 471 times.
✓ Branch 1 taken 2461 times.
2932 if(domidi)
9029 {
9030 2461 int32_t m=DMaps[currdmap].midi;
9031
9032
3/4
✓ Branch 0 taken 2370 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
2461 switch(m)
9033 {
9034 case 1:
9035 81 jukebox(ZC_MIDI_OVERWORLD);
9036 81 break;
9037
9038 case 2:
9039 10 jukebox(ZC_MIDI_DUNGEON);
9040 10 break;
9041
9042 case 3:
9043 jukebox(ZC_MIDI_LEVEL9);
9044 break;
9045
9046 default:
9047
3/4
✓ Branch 0 taken 2078 times.
✓ Branch 1 taken 292 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2078 times.
2370 if(m>=4 && m<4+MAXCUSTOMMIDIS)
9048 2078 jukebox(m+MIDIOFFSET_DMAP);
9049 else
9050 292 music_stop();
9051 2370 }
9052 2461 }
9053 2932 }
9054
9055 2964 void playLevelMusic()
9056 {
9057 2964 int32_t m=tmpscr->screen_midi;
9058
9059
3/6
✓ Branch 0 taken 2916 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 37 times.
✓ Branch 4 taken 11 times.
✗ Branch 5 not taken.
2964 switch(m)
9060 {
9061 case -2:
9062 11 music_stop();
9063 11 break;
9064
9065 case -1:
9066 2916 play_DmapMusic();
9067 2916 break;
9068
9069 case 1:
9070 jukebox(ZC_MIDI_OVERWORLD);
9071 break;
9072
9073 case 2:
9074 jukebox(ZC_MIDI_DUNGEON);
9075 break;
9076
9077 case 3:
9078 jukebox(ZC_MIDI_LEVEL9);
9079 break;
9080
9081 default:
9082
2/4
✓ Branch 0 taken 37 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 37 times.
✗ Branch 3 not taken.
37 if(m>=4 && m<4+MAXCUSTOMMIDIS)
9083 37 jukebox(m+MIDIOFFSET_MAPSCR);
9084 else
9085 music_stop();
9086 37 }
9087 2964 }
9088
9089 395 void master_volume(int32_t dv,int32_t mv)
9090 {
9091
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 395 times.
✓ Branch 2 taken 395 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 395 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 395 times.
✗ Branch 7 not taken.
395 if(dv>=0) digi_volume=zc_max(zc_min(dv,255),0);
9092
9093
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 395 times.
✓ Branch 2 taken 395 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 395 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 395 times.
✗ Branch 7 not taken.
395 if(mv>=0) midi_volume=zc_max(zc_min(mv,255),0);
9094
9095
6/6
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 394 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 380 times.
✓ Branch 5 taken 14 times.
395 int32_t i = zc_min(zc_max(currmidi,0),MAXMIDIS-1);
9096 395 zc_set_volume(digi_volume,mixvol(tunes[i].volume,midi_volume));
9097 395 }
9098
9099 /*****************/
9100 /***** SFX *****/
9101 /*****************/
9102
9103 // array of voices, one for each sfx sample in the data file
9104 // 0+ = voice #
9105 // -1 = voice not allocated
9106 13 void Z_init_sound()
9107 {
9108
2/2
✓ Branch 0 taken 3328 times.
✓ Branch 1 taken 13 times.
3341 for(int32_t i=0; i<WAV_COUNT; i++)
9109 3328 sfx_voice[i]=-1;
9110
9111
2/2
✓ Branch 0 taken 91 times.
✓ Branch 1 taken 13 times.
104 for(int32_t i=0; i<ZC_MIDI_COUNT; i++)
9112 91 tunes[i].data = (MIDI*)mididata[i].dat;
9113
9114
2/2
✓ Branch 0 taken 3276 times.
✓ Branch 1 taken 13 times.
3289 for(int32_t j=0; j<MAXCUSTOMMIDIS; j++)
9115 3276 tunes[ZC_MIDI_COUNT+j].data=NULL;
9116
9117 13 master_volume(digi_volume,midi_volume);
9118 13 }
9119
9120 // returns number of voices currently allocated
9121 int32_t sfx_count()
9122 {
9123 int32_t c=0;
9124
9125 for(int32_t i=0; i<WAV_COUNT; i++)
9126 if(sfx_voice[i]!=-1)
9127 ++c;
9128
9129 return c;
9130 }
9131
9132 // clean up finished samples
9133 2165883 void sfx_cleanup()
9134 {
9135
2/2
✓ Branch 0 taken 554466048 times.
✓ Branch 1 taken 2165883 times.
556631931 for(int32_t i=0; i<WAV_COUNT; i++)
9136
3/4
✓ Branch 0 taken 187234 times.
✓ Branch 1 taken 554278814 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 187234 times.
554653282 if(sfx_voice[i]!=-1 && voice_get_position(sfx_voice[i])<0)
9137 {
9138 187234 deallocate_voice(sfx_voice[i]);
9139 187234 sfx_voice[i]=-1;
9140 187234 }
9141 2165883 }
9142
9143 // allocates a voice for the sample "wav_index" (index into zelda.dat)
9144 // if a voice is already allocated (and/or playing), then it just returns true
9145 // Returns true: voice is allocated
9146 // false: unsuccessful
9147 248526 bool sfx_init(int32_t index)
9148 {
9149 // check index
9150
3/4
✓ Branch 0 taken 211322 times.
✓ Branch 1 taken 37204 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 211322 times.
248526 if(index<=0 || index>=WAV_COUNT)
9151 37204 return false;
9152
9153
2/2
✓ Branch 0 taken 24073 times.
✓ Branch 1 taken 187249 times.
211322 if(sfx_voice[index]==-1)
9154 {
9155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 187249 times.
187249 if(sfxdat)
9156 {
9157 if(index<Z35)
9158 {
9159 sfx_voice[index]=allocate_voice((SAMPLE*)sfxdata[index].dat);
9160 }
9161 else
9162 {
9163 sfx_voice[index]=allocate_voice((SAMPLE*)sfxdata[Z35].dat);
9164 }
9165 }
9166 else
9167 {
9168 187249 sfx_voice[index]=allocate_voice(&customsfxdata[index]);
9169 }
9170
9171 187249 voice_set_volume(sfx_voice[index], sfx_volume);
9172 187249 }
9173
9174 211322 return sfx_voice[index] != -1;
9175 248526 }
9176
9177 // plays an sfx sample
9178 206651 void sfx(int32_t index,int32_t pan,bool loop, bool restart)
9179 {
9180
2/2
✓ Branch 0 taken 187838 times.
✓ Branch 1 taken 18813 times.
206651 if(!sfx_init(index))
9181 18813 return;
9182
9183 187838 voice_set_playmode(sfx_voice[index],loop?PLAYMODE_LOOP:PLAYMODE_PLAY);
9184 187838 voice_set_pan(sfx_voice[index],pan);
9185
9186 187838 int32_t pos = voice_get_position(sfx_voice[index]);
9187
9188
2/2
✓ Branch 0 taken 114807 times.
✓ Branch 1 taken 73031 times.
187838 if(restart) voice_set_position(sfx_voice[index],0);
9189
9190
1/2
✓ Branch 0 taken 187838 times.
✗ Branch 1 not taken.
187838 if(pos<=0)
9191 187838 voice_start(sfx_voice[index]);
9192 206651 }
9193
9194 // true if sfx is allocated
9195 4 bool sfx_allocated(int32_t index)
9196 {
9197
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
4 return (index>0 && index<WAV_COUNT && sfx_voice[index]!=-1);
9198 }
9199
9200 // start it (in loop mode) if it's not already playing,
9201 // otherwise adjust it to play in loop mode -DD
9202 41875 void cont_sfx(int32_t index)
9203 {
9204
2/2
✓ Branch 0 taken 18391 times.
✓ Branch 1 taken 23484 times.
41875 if(!sfx_init(index))
9205 {
9206 18391 return;
9207 }
9208
9209
1/2
✓ Branch 0 taken 23484 times.
✗ Branch 1 not taken.
23484 if(voice_get_position(sfx_voice[index])<=0)
9210 {
9211 23484 voice_set_position(sfx_voice[index],0);
9212 23484 voice_set_playmode(sfx_voice[index],PLAYMODE_LOOP);
9213 23484 voice_start(sfx_voice[index]);
9214 23484 }
9215 else
9216 {
9217 adjust_sfx(index, 128, true);
9218 }
9219 41875 }
9220
9221 // adjust parameters while playing
9222 1203 void adjust_sfx(int32_t index,int32_t pan,bool loop)
9223 {
9224
5/6
✓ Branch 0 taken 423 times.
✓ Branch 1 taken 780 times.
✓ Branch 2 taken 423 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 416 times.
1203 if(index<=0 || index>=WAV_COUNT || sfx_voice[index]==-1)
9225 1196 return;
9226
9227 7 voice_set_playmode(sfx_voice[index],loop?PLAYMODE_LOOP:PLAYMODE_PLAY);
9228 7 voice_set_pan(sfx_voice[index],pan);
9229 1203 }
9230
9231 // pauses a voice
9232 270 void pause_sfx(int32_t index)
9233 {
9234
3/6
✓ Branch 0 taken 270 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 270 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 270 times.
270 if(index>0 && index<WAV_COUNT && sfx_voice[index]!=-1)
9235 voice_stop(sfx_voice[index]);
9236 270 }
9237
9238 // resumes a voice
9239 114 void resume_sfx(int32_t index)
9240 {
9241
3/6
✓ Branch 0 taken 114 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 114 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 114 times.
114 if(index>0 && index<WAV_COUNT && sfx_voice[index]!=-1)
9242 voice_start(sfx_voice[index]);
9243 114 }
9244
9245 // pauses all active voices
9246 58 void pause_all_sfx()
9247 {
9248
2/2
✓ Branch 0 taken 14848 times.
✓ Branch 1 taken 58 times.
14906 for(int32_t i=0; i<WAV_COUNT; i++)
9249
2/2
✓ Branch 0 taken 14846 times.
✓ Branch 1 taken 2 times.
14850 if(sfx_voice[i]!=-1)
9250 2 voice_stop(sfx_voice[i]);
9251 58 }
9252
9253 // resumes all paused voices
9254 44 void resume_all_sfx()
9255 {
9256
2/2
✓ Branch 0 taken 11264 times.
✓ Branch 1 taken 44 times.
11308 for(int32_t i=0; i<WAV_COUNT; i++)
9257
1/2
✓ Branch 0 taken 11264 times.
✗ Branch 1 not taken.
11264 if(sfx_voice[i]!=-1)
9258 voice_start(sfx_voice[i]);
9259 44 }
9260
9261 // stops an sfx and deallocates the voice
9262 1784076 void stop_sfx(int32_t index)
9263 {
9264
3/4
✓ Branch 0 taken 1701357 times.
✓ Branch 1 taken 82719 times.
✓ Branch 2 taken 1701357 times.
✗ Branch 3 not taken.
1784076 if(index<=0 || index>=WAV_COUNT)
9265 82719 return;
9266
9267
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 1701344 times.
1701357 if(sfx_voice[index]!=-1)
9268 {
9269 13 deallocate_voice(sfx_voice[index]);
9270 13 sfx_voice[index]=-1;
9271 13 }
9272 1784076 }
9273
9274 // Stops SFX played by Hero's item of the given family
9275 4287 void stop_item_sfx(int32_t family)
9276 {
9277 4287 int32_t id=current_item_id(family);
9278
9279
2/2
✓ Branch 0 taken 4151 times.
✓ Branch 1 taken 136 times.
4287 if(id<0)
9280 4151 return;
9281
9282 136 stop_sfx(itemsbuf[id].usesound);
9283 4287 }
9284
9285 662 void kill_sfx()
9286 {
9287
2/2
✓ Branch 0 taken 169472 times.
✓ Branch 1 taken 662 times.
170134 for(int32_t i=0; i<WAV_COUNT; i++)
9288
2/2
✓ Branch 0 taken 169470 times.
✓ Branch 1 taken 2 times.
169474 if(sfx_voice[i]!=-1)
9289 {
9290 2 deallocate_voice(sfx_voice[i]);
9291 2 sfx_voice[i]=-1;
9292 2 }
9293 662 }
9294
9295 174258 int32_t pan(int32_t x)
9296 {
9297
1/4
✓ Branch 0 taken 174258 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
174258 switch(pan_style)
9298 {
9299 case 0:
9300 return 128;
9301
9302 case 1:
9303 174258 return vbound((x>>1)+68,0,255);
9304
9305 case 2:
9306 return vbound(((x*3)>>2)+36,0,255);
9307 }
9308
9309 return vbound(x,0,255);
9310 174258 }
9311
9312 /*******************************/
9313 /******* Input Handlers ********/
9314 /*******************************/
9315
9316 4131910 bool joybtn(int32_t b)
9317 {
9318
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4131910 times.
4131910 if(b == 0)
9319 return false;
9320
9321 4131910 return joy[joystick_index].button[b-1].b !=0;
9322 4131910 }
9323
9324 const char* joybtn_name(int32_t b)
9325 {
9326 if(b == 0)
9327 return "";
9328
9329 return joy[joystick_index].button[b-1].name;
9330 }
9331
9332 int32_t next_press_key()
9333 {
9334 return readkey()>>8;
9335 }
9336
9337 int32_t next_press_btn()
9338 {
9339 clear_keybuf();
9340 /*bool b[joy[joystick_index].num_buttons+1];
9341
9342 for(int32_t i=1; i<=joy[joystick_index].num_buttons; i++)
9343 b[i]=joybtn(i);*/
9344
9345 //first, we need to wait until they're pressing no buttons
9346 for(;;)
9347 {
9348 if(keypressed())
9349 {
9350 switch(readkey()>>8)
9351 {
9352 case KEY_ESC:
9353 return -1;
9354
9355 case KEY_SPACE:
9356 return 0;
9357 }
9358 }
9359
9360 poll_joystick();
9361 bool done = true;
9362
9363 for(int32_t i=1; i<=joy[joystick_index].num_buttons; i++)
9364 {
9365 if(joybtn(i)) done = false;
9366 }
9367
9368 if(done) break;
9369 rest(1);
9370 }
9371
9372 //now, we need to wait for them to press any button
9373 for(;;)
9374 {
9375 if(keypressed())
9376 {
9377 switch(readkey()>>8)
9378 {
9379 case KEY_ESC:
9380 return -1;
9381
9382 case KEY_SPACE:
9383 return 0;
9384 }
9385 }
9386
9387 poll_joystick();
9388
9389 for(int32_t i=1; i<=joy[joystick_index].num_buttons; i++)
9390 {
9391 if(joybtn(i)) return i;
9392 }
9393 rest(1);
9394 }
9395 }
9396
9397 44448700 static bool rButton(bool &btn, bool &flag, bool* rawbtn = nullptr)
9398 {
9399
2/2
✓ Branch 0 taken 42752924 times.
✓ Branch 1 taken 1695776 times.
44448700 bool ret = btn && !flag;
9400
2/2
✓ Branch 0 taken 44354521 times.
✓ Branch 1 taken 94179 times.
44448700 flag = rawbtn ? *rawbtn : btn;
9401
9402 44448700 return ret;
9403 }
9404 864 static bool rButtonPeek(bool btn, bool flag)
9405 {
9406
2/2
✓ Branch 0 taken 828 times.
✓ Branch 1 taken 36 times.
864 if(!btn)
9407 {
9408 828 return false;
9409 }
9410
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 27 times.
36 else if(!flag)
9411 {
9412 9 return true;
9413 }
9414
9415 27 return false;
9416 864 }
9417
9418 // Updated only by keyboard/gamepad.
9419 // If in replay mode, this is set directly by the replay system.
9420 // This should never be read from directly - use control_state instead.
9421 bool raw_control_state[ZC_CONTROL_STATES];
9422
9423 // Every call to load_control_state (pretty much every frame) resets this to be equal to raw_control_state.
9424 // This state can drift from raw_control_state if button states are "eaten" or overriden by a script. But that only
9425 // lasts until the next call to load_control_state.
9426 bool control_state[ZC_CONTROL_STATES];
9427 bool disable_control[ZC_CONTROL_STATES];
9428 bool drunk_toggle_state[11];
9429 bool disabledKeys[127];
9430 bool KeyInput[127];
9431 bool KeyPress[127];
9432
9433 bool key_current_frame[127];
9434 bool key_previous_frame[127];
9435
9436 static bool key_system[127];
9437 static bool key_system_previous[127];
9438 static bool key_system_press[127];
9439
9440 bool button_press[ZC_CONTROL_STATES];
9441 bool button_hold[ZC_CONTROL_STATES];
9442
9443 #define STICK_1_X joy[joystick_index].stick[js_stick_1_x_stick].axis[js_stick_1_x_axis]
9444 #define STICK_1_Y joy[joystick_index].stick[js_stick_1_y_stick].axis[js_stick_1_y_axis]
9445 #define STICK_2_X joy[joystick_index].stick[js_stick_2_x_stick].axis[js_stick_2_x_axis]
9446 #define STICK_2_Y joy[joystick_index].stick[js_stick_2_y_stick].axis[js_stick_2_y_axis]
9447 #define STICK_PRECISION 56 //define your own sensitivity
9448
9449 1793833 void load_control_state()
9450 {
9451
4/4
✓ Branch 0 taken 1793830 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 13721 times.
✓ Branch 3 taken 1780109 times.
1793833 if (!replay_is_active() || replay_get_version() >= 8)
9452 {
9453
2/2
✓ Branch 0 taken 247032 times.
✓ Branch 1 taken 13724 times.
260756 for (int i = 0; i < ZC_CONTROL_STATES; i++)
9454 247032 down_control_states[i] = raw_control_state[i];
9455 13724 }
9456
9457
1/2
✓ Branch 0 taken 1793833 times.
✗ Branch 1 not taken.
1793833 if (!replay_is_replaying())
9458 {
9459 raw_control_state[0]=zc_getrawkey(DUkey, true)||(analog_movement ? STICK_1_Y.d1 || STICK_1_Y.pos - js_stick_1_y_offset < -STICK_PRECISION : joybtn(DUbtn));
9460 raw_control_state[1]=zc_getrawkey(DDkey, true)||(analog_movement ? STICK_1_Y.d2 || STICK_1_Y.pos - js_stick_1_y_offset > STICK_PRECISION : joybtn(DDbtn));
9461 raw_control_state[2]=zc_getrawkey(DLkey, true)||(analog_movement ? STICK_1_X.d1 || STICK_1_X.pos - js_stick_1_x_offset < -STICK_PRECISION : joybtn(DLbtn));
9462 raw_control_state[3]=zc_getrawkey(DRkey, true)||(analog_movement ? STICK_1_X.d2 || STICK_1_X.pos - js_stick_1_x_offset > STICK_PRECISION : joybtn(DRbtn));
9463 raw_control_state[4]=zc_getrawkey(Akey, true)||joybtn(Abtn);
9464 raw_control_state[5]=zc_getrawkey(Bkey, true)||joybtn(Bbtn);
9465 raw_control_state[6]=zc_getrawkey(Skey, true)||joybtn(Sbtn);
9466 raw_control_state[7]=zc_getrawkey(Lkey, true)||joybtn(Lbtn);
9467 raw_control_state[8]=zc_getrawkey(Rkey, true)||joybtn(Rbtn);
9468 raw_control_state[9]=zc_getrawkey(Pkey, true)||joybtn(Pbtn);
9469 raw_control_state[10]=zc_getrawkey(Exkey1, true)||joybtn(Exbtn1);
9470 raw_control_state[11]=zc_getrawkey(Exkey2, true)||joybtn(Exbtn2);
9471 raw_control_state[12]=zc_getrawkey(Exkey3, true)||joybtn(Exbtn3);
9472 raw_control_state[13]=zc_getrawkey(Exkey4, true)||joybtn(Exbtn4);
9473
9474 if(num_joysticks != 0)
9475 {
9476 raw_control_state[14] = STICK_2_Y.pos - js_stick_2_y_offset < -STICK_PRECISION;
9477 raw_control_state[15] = STICK_2_Y.pos - js_stick_2_y_offset > STICK_PRECISION;
9478 raw_control_state[16] = STICK_2_X.pos - js_stick_2_x_offset < -STICK_PRECISION;
9479 raw_control_state[17] = STICK_2_X.pos - js_stick_2_x_offset > STICK_PRECISION;
9480 // zprint2("Detected %d joysticks... %d%d%d%d\n", num_joysticks, raw_control_state[14]?1:0, raw_control_state[15]?1:0, raw_control_state[16]?1:0, raw_control_state[17]?1:0);
9481 }
9482 else
9483 {
9484 raw_control_state[14] = false;
9485 raw_control_state[15] = false;
9486 raw_control_state[16] = false;
9487 raw_control_state[17] = false;
9488 // zprint2("Detected 0 joysticks... clearing inputaxis values.\n");
9489 }
9490 }
9491
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1793830 times.
1793833 if (replay_is_active())
9492 {
9493
2/2
✓ Branch 0 taken 1015215 times.
✓ Branch 1 taken 778615 times.
1793830 if (replay_get_version() < 3)
9494 1015215 replay_poll();
9495
3/4
✓ Branch 0 taken 778615 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108332 times.
✓ Branch 3 taken 670283 times.
778615 else if (replay_is_replaying() && replay_get_version() < 6)
9496 670283 replay_peek_input();
9497
3/4
✓ Branch 0 taken 108332 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 94608 times.
✓ Branch 3 taken 13724 times.
108332 else if (replay_is_replaying() && replay_get_version() >= 8)
9498 13724 replay_peek_input();
9499 1793830 }
9500
9501
3/4
✓ Branch 0 taken 1793827 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13724 times.
✓ Branch 3 taken 1780103 times.
1793833 if (!replay_is_active() || replay_get_version() >= 8)
9502 13724 update_keys();
9503
9504 // Some test replay files were made before a serious input bug was fixed, so instead
9505 // of re-doing them or tossing them out, just check for that zplay version.
9506
3/4
✓ Branch 0 taken 1793827 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 121900 times.
✓ Branch 3 taken 1671927 times.
1793827 bool botched_input = replay_is_active() && replay_get_version() != 1 && replay_get_version() < 8;
9507
2/2
✓ Branch 0 taken 1793827 times.
✓ Branch 1 taken 32288886 times.
34082713 for (int i = 0; i < ZC_CONTROL_STATES; i++)
9508 {
9509 32288886 control_state[i] = raw_control_state[i];
9510
4/4
✓ Branch 0 taken 29847654 times.
✓ Branch 1 taken 2441232 times.
✓ Branch 2 taken 1498723 times.
✓ Branch 3 taken 28348931 times.
32288886 if (botched_input && !control_state[i])
9511 28348931 down_control_states[i] = false;
9512 32288886 }
9513
9514 1793827 button_press[0]=rButton(control_state[0],button_hold[0]);
9515 1793827 button_press[1]=rButton(control_state[1],button_hold[1]);
9516 1793827 button_press[2]=rButton(control_state[2],button_hold[2]);
9517 1793827 button_press[3]=rButton(control_state[3],button_hold[3]);
9518 1793827 button_press[4]=rButton(control_state[4],button_hold[4]);
9519 1793827 button_press[5]=rButton(control_state[5],button_hold[5]);
9520 1793827 button_press[6]=rButton(control_state[6],button_hold[6]);
9521 1793827 button_press[7]=rButton(control_state[7],button_hold[7]);
9522 1793827 button_press[8]=rButton(control_state[8],button_hold[8]);
9523 1793827 button_press[9]=rButton(control_state[9],button_hold[9]);
9524 1793827 button_press[10]=rButton(control_state[10],button_hold[10]);
9525 1793827 button_press[11]=rButton(control_state[11],button_hold[11]);
9526 1793827 button_press[12]=rButton(control_state[12],button_hold[12]);
9527 1793827 button_press[13]=rButton(control_state[13],button_hold[13]);
9528 1793827 button_press[14]=rButton(control_state[14],button_hold[14]);
9529 1793827 button_press[15]=rButton(control_state[15],button_hold[15]);
9530 1793827 button_press[16]=rButton(control_state[16],button_hold[16]);
9531 1793827 button_press[17]=rButton(control_state[17],button_hold[17]);
9532 1793827 }
9533
9534 // Returns true if any game key is pressed. This is needed because keypressed()
9535 // doesn't detect modifier keys and control_state[] can be modified by scripts.
9536 8675059 bool zc_key_pressed()
9537 //may also need to use zc_getrawkey
9538 {
9539
7/10
✓ Branch 0 taken 6903836 times.
✓ Branch 1 taken 1771223 times.
✓ Branch 2 taken 1771223 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1771223 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1483350 times.
✓ Branch 7 taken 1483350 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 404478 times.
9079537 if((zc_getrawkey(DUkey, true)||(analog_movement ? STICK_1_Y.d1 || STICK_1_Y.pos - js_stick_1_y_offset< -STICK_PRECISION : joybtn(DUbtn))) ||
9540
4/6
✓ Branch 0 taken 1483350 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1483350 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1082505 times.
✓ Branch 5 taken 1082505 times.
1483350 (zc_getrawkey(DDkey, true)||(analog_movement ? STICK_1_Y.d2 || STICK_1_Y.pos - js_stick_1_y_offset > STICK_PRECISION : joybtn(DDbtn))) ||
9541
4/6
✓ Branch 0 taken 1082505 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1082505 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 640053 times.
✓ Branch 5 taken 640053 times.
1082505 (zc_getrawkey(DLkey, true)||(analog_movement ? STICK_1_X.d1 || STICK_1_X.pos - js_stick_1_x_offset < -STICK_PRECISION : joybtn(DLbtn))) ||
9542
4/6
✓ Branch 0 taken 640053 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 640053 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 462411 times.
✓ Branch 5 taken 462411 times.
640053 (zc_getrawkey(DRkey, true)||(analog_movement ? STICK_1_X.d2 || STICK_1_X.pos - js_stick_1_x_offset > STICK_PRECISION : joybtn(DRbtn))) ||
9543
1/2
✓ Branch 0 taken 462411 times.
✗ Branch 1 not taken.
462411 (zc_getrawkey(Akey, true)||joybtn(Abtn)) ||
9544
3/4
✓ Branch 0 taken 423155 times.
✓ Branch 1 taken 39256 times.
✓ Branch 2 taken 423155 times.
✗ Branch 3 not taken.
462411 (zc_getrawkey(Bkey, true)||joybtn(Bbtn)) ||
9545
3/4
✓ Branch 0 taken 409604 times.
✓ Branch 1 taken 13551 times.
✓ Branch 2 taken 409604 times.
✗ Branch 3 not taken.
423155 (zc_getrawkey(Skey, true)||joybtn(Sbtn)) ||
9546
3/4
✓ Branch 0 taken 407555 times.
✓ Branch 1 taken 2049 times.
✓ Branch 2 taken 407555 times.
✗ Branch 3 not taken.
409604 (zc_getrawkey(Lkey, true)||joybtn(Lbtn)) ||
9547
3/4
✓ Branch 0 taken 405267 times.
✓ Branch 1 taken 2288 times.
✓ Branch 2 taken 405267 times.
✗ Branch 3 not taken.
407555 (zc_getrawkey(Rkey, true)||joybtn(Rbtn)) ||
9548
3/4
✓ Branch 0 taken 405263 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 405263 times.
✗ Branch 3 not taken.
405267 (zc_getrawkey(Pkey, true)||joybtn(Pbtn)) ||
9549
3/4
✓ Branch 0 taken 405221 times.
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 405221 times.
✗ Branch 3 not taken.
405263 (zc_getrawkey(Exkey1, true)||joybtn(Exbtn1)) ||
9550
3/4
✓ Branch 0 taken 404478 times.
✓ Branch 1 taken 743 times.
✓ Branch 2 taken 404478 times.
✗ Branch 3 not taken.
405221 (zc_getrawkey(Exkey2, true)||joybtn(Exbtn2)) ||
9551
2/4
✓ Branch 0 taken 404478 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 404478 times.
✗ Branch 3 not taken.
404478 (zc_getrawkey(Exkey3, true)||joybtn(Exbtn3)) ||
9552
1/2
✓ Branch 0 taken 404478 times.
✗ Branch 1 not taken.
404478 (zc_getrawkey(Exkey4, true)||joybtn(Exbtn4))) // Skipping joystick axes
9553 15607219 return true;
9554
9555 404478 return false;
9556 2204025 }
9557
9558 36312301 bool getInput(int32_t btn, bool press, bool drunk, bool ignoreDisable, bool eatEntirely, bool peek)
9559 {
9560 36312301 bool ret = false, drunkstate = false, rawret = false;
9561 36312301 bool* flag = &down_control_states[btn];
9562
2/7
✓ Branch 0 taken 34105542 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2206759 times.
36312301 switch(btn)
9563 {
9564 case btnF12:
9565 ret = zc_getkey(KEY_F12, ignoreDisable);
9566 rawret = zc_getrawkey(KEY_F12, ignoreDisable);
9567 eatEntirely = false;
9568 break;
9569 case btnF11:
9570 ret = zc_getkey(KEY_F11, ignoreDisable);
9571 rawret = zc_getrawkey(KEY_F11, ignoreDisable);
9572 eatEntirely = false;
9573 break;
9574 case btnF5:
9575 ret = zc_getkey(KEY_F5, ignoreDisable);
9576 rawret = zc_getrawkey(KEY_F5, ignoreDisable);
9577 eatEntirely = false;
9578 break;
9579 case btnQ:
9580 ret = zc_getkey(KEY_Q, ignoreDisable);
9581 rawret = zc_getrawkey(KEY_Q, ignoreDisable);
9582 eatEntirely = false;
9583 break;
9584 case btnI:
9585 ret = zc_getkey(KEY_I, ignoreDisable);
9586 rawret = zc_getrawkey(KEY_I, ignoreDisable);
9587 eatEntirely = false;
9588 break;
9589 case btnM:
9590
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2206759 times.
2206759 if(FFCore.kb_typing_mode) return false;
9591 2206759 rawret = ret = zc_getrawkey(KEY_ESC, ignoreDisable);
9592 2206759 eatEntirely = false;
9593 2206759 break;
9594 default: //control_state[] index
9595
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34105542 times.
34105542 if(FFCore.kb_typing_mode) return false;
9596
5/6
✓ Branch 0 taken 34062309 times.
✓ Branch 1 taken 43233 times.
✓ Branch 2 taken 1875887 times.
✓ Branch 3 taken 32186422 times.
✓ Branch 4 taken 1875887 times.
✗ Branch 5 not taken.
34105542 if(!ignoreDisable && get_bit(quest_rules, qr_FIXDRUNKINPUTS) && disable_control[btn]) drunk = false;
9597
2/2
✓ Branch 0 taken 1863356 times.
✓ Branch 1 taken 32242186 times.
34105542 else if(btn<11) drunkstate = drunk_toggle_state[btn];
9598
4/4
✓ Branch 0 taken 30333615 times.
✓ Branch 1 taken 3771927 times.
✓ Branch 2 taken 713 times.
✓ Branch 3 taken 3771214 times.
37877469 ret = control_state[btn] && (ignoreDisable || !disable_control[btn]);
9599 34105542 rawret = raw_control_state[btn];
9600 34105542 }
9601
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36312301 times.
36312301 assert(flag);
9602
2/2
✓ Branch 0 taken 24151623 times.
✓ Branch 1 taken 12160678 times.
36312301 if(press)
9603 {
9604
2/2
✓ Branch 0 taken 864 times.
✓ Branch 1 taken 12159814 times.
12160678 if(peek)
9605 864 ret = rButtonPeek(ret, *flag);
9606
3/4
✓ Branch 0 taken 12159814 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 94179 times.
✓ Branch 3 taken 12065635 times.
12159814 else if (replay_is_active() && replay_get_version() < 8) ret = rButton(ret, *flag);
9607 94179 else ret = rButton(ret, *flag, &rawret);
9608 12160678 }
9609
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36312301 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36312301 if(eatEntirely && ret) control_state[btn] = false;
9610
3/4
✓ Branch 0 taken 28035807 times.
✓ Branch 1 taken 8276494 times.
✓ Branch 2 taken 28035807 times.
✗ Branch 3 not taken.
36312301 if(drunk && drunkstate) ret = !ret;
9611 36312301 return ret;
9612 36312301 }
9613
9614 23568 byte getIntBtnInput(byte intbtn, bool press, bool drunk, bool ignoreDisable, bool eatEntirely, bool peek)
9615 {
9616 23568 byte ret = 0;
9617
2/2
✓ Branch 0 taken 22704 times.
✓ Branch 1 taken 864 times.
23568 if(intbtn & INT_BTN_A) ret |= getInput(btnA, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_A : 0;
9618
1/2
✓ Branch 0 taken 23568 times.
✗ Branch 1 not taken.
23568 if(intbtn & INT_BTN_B) ret |= getInput(btnB, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_B : 0;
9619
1/2
✓ Branch 0 taken 23568 times.
✗ Branch 1 not taken.
23568 if(intbtn & INT_BTN_L) ret |= getInput(btnL, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_L : 0;
9620
1/2
✓ Branch 0 taken 23568 times.
✗ Branch 1 not taken.
23568 if(intbtn & INT_BTN_R) ret |= getInput(btnR, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_R : 0;
9621
1/2
✓ Branch 0 taken 23568 times.
✗ Branch 1 not taken.
23568 if(intbtn & INT_BTN_EX1) ret |= getInput(btnEx1, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_EX1 : 0;
9622
1/2
✓ Branch 0 taken 23568 times.
✗ Branch 1 not taken.
23568 if(intbtn & INT_BTN_EX2) ret |= getInput(btnEx2, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_EX2 : 0;
9623
1/2
✓ Branch 0 taken 23568 times.
✗ Branch 1 not taken.
23568 if(intbtn & INT_BTN_EX3) ret |= getInput(btnEx3, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_EX3 : 0;
9624
1/2
✓ Branch 0 taken 23568 times.
✗ Branch 1 not taken.
23568 if(intbtn & INT_BTN_EX4) ret |= getInput(btnEx4, press, drunk, ignoreDisable, eatEntirely, peek) ? INT_BTN_EX4 : 0;
9625 23568 return ret; //No early return, to make sure all button presses are eaten that should be! -Em
9626 }
9627
9628 byte checkIntBtnVal(byte intbtn, byte vals)
9629 {
9630 return intbtn&vals;
9631 }
9632
9633 375816 bool Up()
9634 {
9635 375816 return getInput(btnUp);
9636 }
9637 11680 bool Down()
9638 {
9639 11680 return getInput(btnDown);
9640 }
9641 19441 bool Left()
9642 {
9643 19441 return getInput(btnLeft);
9644 }
9645 22425 bool Right()
9646 {
9647 22425 return getInput(btnRight);
9648 }
9649 15242 bool cAbtn()
9650 {
9651 15242 return getInput(btnA);
9652 }
9653 512746 bool cBbtn()
9654 {
9655 512746 return getInput(btnB);
9656 }
9657 bool cSbtn()
9658 {
9659 return getInput(btnS);
9660 }
9661 bool cLbtn()
9662 {
9663 return getInput(btnL);
9664 }
9665 bool cRbtn()
9666 {
9667 return getInput(btnR);
9668 }
9669 bool cPbtn()
9670 {
9671 return getInput(btnP);
9672 }
9673 bool cEx1btn()
9674 {
9675 return getInput(btnEx1);
9676 }
9677 bool cEx2btn()
9678 {
9679 return getInput(btnEx2);
9680 }
9681 bool cEx3btn()
9682 {
9683 return getInput(btnEx3);
9684 }
9685 bool cEx4btn()
9686 {
9687 return getInput(btnEx4);
9688 }
9689 bool AxisUp()
9690 {
9691 return getInput(btnAxisUp);
9692 }
9693 bool AxisDown()
9694 {
9695 return getInput(btnAxisDown);
9696 }
9697 bool AxisLeft()
9698 {
9699 return getInput(btnAxisLeft);
9700 }
9701 bool AxisRight()
9702 {
9703 return getInput(btnAxisRight);
9704 }
9705
9706 bool cMbtn()
9707 {
9708 return getInput(btnM);
9709 }
9710 bool cF12()
9711 {
9712 return getInput(btnF12);
9713 }
9714 bool cF11()
9715 {
9716 return getInput(btnF11);
9717 }
9718 bool cF5()
9719 {
9720 return getInput(btnF5);
9721 }
9722 bool cQ()
9723 {
9724 return getInput(btnQ);
9725 }
9726 bool cI()
9727 {
9728 return getInput(btnI);
9729 }
9730
9731 9087 bool rUp()
9732 {
9733 9087 return getInput(btnUp, true);
9734 }
9735 9056 bool rDown()
9736 {
9737 9056 return getInput(btnDown, true);
9738 }
9739 9047 bool rLeft()
9740 {
9741 9047 return getInput(btnLeft, true);
9742 }
9743 8908 bool rRight()
9744 {
9745 8908 return getInput(btnRight, true);
9746 }
9747 203 bool rAbtn()
9748 {
9749 203 return getInput(btnA, true);
9750 }
9751 9290 bool rBbtn()
9752 {
9753 9290 return getInput(btnB, true);
9754 }
9755 1774495 bool rSbtn()
9756 {
9757 1774495 return getInput(btnS, true);
9758 }
9759 2204025 bool rMbtn()
9760 {
9761 2204025 return getInput(btnM, true);
9762 }
9763 8830 bool rLbtn()
9764 {
9765 8830 return getInput(btnL, true);
9766 }
9767 8827 bool rRbtn()
9768 {
9769 8827 return getInput(btnR, true);
9770 }
9771 1764696 bool rPbtn()
9772 {
9773 1764696 return getInput(btnP, true);
9774 }
9775 bool rEx1btn()
9776 {
9777 return getInput(btnEx1, true);
9778 }
9779 bool rEx2btn()
9780 {
9781 return getInput(btnEx2, true);
9782 }
9783 9391 bool rEx3btn()
9784 {
9785 9391 return getInput(btnEx3, true);
9786 }
9787 9391 bool rEx4btn()
9788 {
9789 9391 return getInput(btnEx4, true);
9790 }
9791 bool rAxisUp()
9792 {
9793 return getInput(btnAxisUp, true);
9794 }
9795 bool rAxisDown()
9796 {
9797 return getInput(btnAxisDown, true);
9798 }
9799 bool rAxisLeft()
9800 {
9801 return getInput(btnAxisLeft, true);
9802 }
9803 bool rAxisRight()
9804 {
9805 return getInput(btnAxisRight, true);
9806 }
9807
9808 bool rF11()
9809 {
9810 return getInput(btnF11, true);
9811 }
9812 bool rQ()
9813 {
9814 return getInput(btnQ, true);
9815 }
9816 bool rI()
9817 {
9818 return getInput(btnI, true);
9819 }
9820
9821 4656283 bool DrunkUp()
9822 {
9823 4656283 return getInput(btnUp, false, true);
9824 }
9825 4336493 bool DrunkDown()
9826 {
9827 4336493 return getInput(btnDown, false, true);
9828 }
9829 2855389 bool DrunkLeft()
9830 {
9831 2855389 return getInput(btnLeft, false, true);
9832 }
9833 2510171 bool DrunkRight()
9834 {
9835 2510171 return getInput(btnRight, false, true);
9836 }
9837 2041699 bool DrunkcAbtn()
9838 {
9839 2041699 return getInput(btnA, false, true);
9840 }
9841 1816907 bool DrunkcBbtn()
9842 {
9843 1816907 return getInput(btnB, false, true);
9844 }
9845 1764690 bool DrunkcEx1btn()
9846 {
9847 1764690 return getInput(btnEx1, false, true);
9848 }
9849 1764710 bool DrunkcEx2btn()
9850 {
9851 1764710 return getInput(btnEx2, false, true);
9852 }
9853 bool DrunkcSbtn()
9854 {
9855 return getInput(btnS, false, true);
9856 }
9857 bool DrunkcMbtn()
9858 {
9859 return getInput(btnM, false, true);
9860 }
9861 bool DrunkcLbtn()
9862 {
9863 return getInput(btnL, false, true);
9864 }
9865 bool DrunkcRbtn()
9866 {
9867 return getInput(btnR, false, true);
9868 }
9869 bool DrunkcPbtn()
9870 {
9871 return getInput(btnP, false, true);
9872 }
9873
9874 bool DrunkrUp()
9875 {
9876 return getInput(btnUp, true, true);
9877 }
9878 bool DrunkrDown()
9879 {
9880 return getInput(btnDown, true, true);
9881 }
9882 bool DrunkrLeft()
9883 {
9884 return getInput(btnLeft, true, true);
9885 }
9886 bool DrunkrRight()
9887 {
9888 return getInput(btnRight, true, true);
9889 }
9890 1396579 bool DrunkrAbtn()
9891 {
9892 1396579 return getInput(btnA, true, true);
9893 }
9894 1391193 bool DrunkrBbtn()
9895 {
9896 1391193 return getInput(btnB, true, true);
9897 }
9898 71669 bool DrunkrEx1btn()
9899 {
9900 71669 return getInput(btnEx1, true, true);
9901 }
9902 71662 bool DrunkrEx2btn()
9903 {
9904 71662 return getInput(btnEx2, true, true);
9905 }
9906 bool DrunkrEx3btn()
9907 {
9908 return getInput(btnEx3, true, true);
9909 }
9910 bool DrunkrEx4btn()
9911 {
9912 return getInput(btnEx4, true, true);
9913 }
9914 bool DrunkrSbtn()
9915 {
9916 return getInput(btnS, true, true);
9917 }
9918 bool DrunkrMbtn()
9919 {
9920 return getInput(btnM, true, true);
9921 }
9922 1679091 bool DrunkrLbtn()
9923 {
9924 1679091 return getInput(btnL, true, true);
9925 }
9926 1678407 bool DrunkrRbtn()
9927 {
9928 1678407 return getInput(btnR, true, true);
9929 }
9930 bool DrunkrPbtn()
9931 {
9932 return getInput(btnP, true, true);
9933 }
9934
9935 2734 void eat_buttons()
9936 {
9937 2734 getInput(btnA, true, false, true);
9938 2734 getInput(btnB, true, false, true);
9939 2734 getInput(btnS, true, false, true);
9940 2734 getInput(btnM, true, false, true);
9941 2734 getInput(btnL, true, false, true);
9942 2734 getInput(btnR, true, false, true);
9943 2734 getInput(btnP, true, false, true);
9944 2734 getInput(btnEx1, true, false, true);
9945 2734 getInput(btnEx2, true, false, true);
9946 2734 getInput(btnEx3, true, false, true);
9947 2734 getInput(btnEx4, true, false, true);
9948 2734 }
9949
9950 // Is true for the _first frame_ of a key press.
9951 // But! it is possible that a script manually sets the value of KeyPress,
9952 // in which case it will be restored to the "true" value based on `key_current_frame`
9953 // and `key_previous_frame` on the next frame.
9954 14 bool zc_readkey(int32_t k, bool ignoreDisable)
9955 {
9956
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if(ignoreDisable) return KeyPress[k];
9957
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 switch(k)
9958 {
9959 case KEY_F7:
9960 case KEY_F8:
9961 case KEY_F9:
9962 return KeyPress[k];
9963
9964 default:
9965
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 1 times.
14 return KeyPress[k] && !disabledKeys[k];
9966 }
9967 14 }
9968
9969 // Is true for _every frame_ a key is held down.
9970 // But! it is possible that a script manually sets the value of KeyInput,
9971 // in which case it will be restored to the "true" value based on `key_current_frame`
9972 // on the next frame.
9973 bool zc_getkey(int32_t k, bool ignoreDisable)
9974 {
9975 if(ignoreDisable) return KeyInput[k];
9976 switch(k)
9977 {
9978 case KEY_F7:
9979 case KEY_F8:
9980 case KEY_F9:
9981 return KeyInput[k];
9982
9983 default:
9984 return KeyInput[k] && !disabledKeys[k];
9985 }
9986 }
9987
9988 // Reads (and then clears) the current frame key state directly.
9989 // Scripts can also modify `key_current_frame`.
9990 26768522 bool zc_readrawkey(int32_t k, bool ignoreDisable)
9991 {
9992
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26768522 times.
26768522 if(zc_getrawkey(k, ignoreDisable))
9993 {
9994 _key[k]=key[k]=key_current_frame[k]=0;
9995 return true;
9996 }
9997 26768522 _key[k]=key[k]=key_current_frame[k]=0;
9998 26768522 return false;
9999 26768522 }
10000
10001 // Reads the current frame key state directly.
10002 // Scripts can also modify `key_current_frame`.
10003 39883869 bool zc_getrawkey(int32_t k, bool ignoreDisable)
10004 {
10005
2/2
✓ Branch 0 taken 10911336 times.
✓ Branch 1 taken 28972533 times.
39883869 if(ignoreDisable) return key_current_frame[k];
10006
2/2
✓ Branch 0 taken 13384240 times.
✓ Branch 1 taken 15588293 times.
28972533 switch(k)
10007 {
10008 case KEY_F7:
10009 case KEY_F8:
10010 case KEY_F9:
10011 13384240 return key_current_frame[k];
10012
10013 default:
10014
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15588293 times.
15588293 return key_current_frame[k] && !disabledKeys[k];
10015 }
10016 39883869 }
10017
10018 // Only used for a handful of keys, like tilde and Function keys.
10019 // This state is never read within the game.
10020 // It exists so that all keyboard input still functions during replay,
10021 // without inadvertently doing things like toggling throttling if the player
10022 // presses ~
10023 4331782 bool zc_get_system_key(int32_t k)
10024 {
10025 4331782 return key_system[k];
10026 }
10027
10028 // True for the _first_ frame of a key press.
10029 24244275 bool zc_read_system_key(int32_t k)
10030 {
10031 24244275 return key_system_press[k];
10032 }
10033
10034 279911175 bool is_system_key(int32_t k)
10035 {
10036
2/2
✓ Branch 0 taken 260074950 times.
✓ Branch 1 taken 19836225 times.
279911175 switch (k)
10037 {
10038 case KEY_BACKQUOTE:
10039 case KEY_CLOSEBRACE:
10040 case KEY_END:
10041 case KEY_HOME:
10042 case KEY_OPENBRACE:
10043 case KEY_PGDN:
10044 case KEY_PGUP:
10045 case KEY_TAB:
10046 case KEY_TILDE:
10047 19836225 return true;
10048 }
10049 260074950 return is_Fkey(k);
10050 279911175 }
10051
10052 2204025 void update_system_keys()
10053 {
10054 2204025 poll_keyboard();
10055
2/2
✓ Branch 0 taken 279911175 times.
✓ Branch 1 taken 2204025 times.
282115200 for (int32_t q = 0; q < 127; ++q)
10056 {
10057
2/2
✓ Branch 0 taken 46284525 times.
✓ Branch 1 taken 233626650 times.
279911175 if (!is_system_key(q))
10058 233626650 continue;
10059
10060 46284525 key_system[q] = key[q];
10061
1/2
✓ Branch 0 taken 46284525 times.
✗ Branch 1 not taken.
46284525 key_system_press[q] = key_system[q] && !key_system_previous[q];
10062 46284525 key_system_previous[q] = key_system[q];
10063 46284525 }
10064 2204025 }
10065
10066 2179607 void update_keys()
10067 {
10068
1/2
✓ Branch 0 taken 2179607 times.
✗ Branch 1 not taken.
2179607 if (!replay_is_replaying())
10069 poll_keyboard();
10070
10071
2/2
✓ Branch 0 taken 2179607 times.
✓ Branch 1 taken 276810089 times.
278989696 for (int32_t q = 0; q < 127; ++q)
10072 {
10073 // When replaying, replay.cpp takes care of updating `key_current_frame`.
10074
1/2
✓ Branch 0 taken 276810089 times.
✗ Branch 1 not taken.
276810089 if (!replay_is_replaying())
10075 key_current_frame[q] = key[q];
10076
10077
2/2
✓ Branch 0 taken 274783676 times.
✓ Branch 1 taken 2026413 times.
276810089 KeyPress[q] = key_current_frame[q] && !key_previous_frame[q];
10078 276810089 KeyInput[q] = key_current_frame[q];
10079 276810089 key_previous_frame[q] = key_current_frame[q];
10080 276810089 }
10081 2179607 }
10082
10083 bool zc_disablekey(int32_t k, bool val)
10084 {
10085 switch(k)
10086 {
10087 case KEY_F7:
10088 case KEY_F8:
10089 case KEY_F9:
10090 return false;
10091
10092 default:
10093 disabledKeys[k] = val;
10094 return true;
10095 }
10096 }
10097
10098 void zc_putpixel(int32_t layer, int32_t x, int32_t y, int32_t cset, int32_t color, int32_t timer)
10099 {
10100 timer=timer;
10101 particles.add(new particle(zfix(x), zfix(y), layer, cset, color));
10102 }
10103
10104 // these are here so that copy_dialog won't choke when compiling zelda
10105 int32_t d_alltriggerbutton_proc(int32_t, DIALOG*, int32_t)
10106 {
10107 return D_O_K;
10108 }
10109
10110 int32_t d_comboa_radio_proc(int32_t, DIALOG*, int32_t)
10111 {
10112 return D_O_K;
10113 }
10114
10115 int32_t d_comboabutton_proc(int32_t, DIALOG*, int32_t)
10116 {
10117 return D_O_K;
10118 }
10119
10120 int32_t d_ssdn_btn_proc(int32_t, DIALOG*, int32_t)
10121 {
10122 return D_O_K;
10123 }
10124
10125 int32_t d_ssdn_btn2_proc(int32_t, DIALOG*, int32_t)
10126 {
10127 return D_O_K;
10128 }
10129
10130 int32_t d_ssdn_btn3_proc(int32_t, DIALOG*, int32_t)
10131 {
10132 return D_O_K;
10133 }
10134
10135 int32_t d_ssdn_btn4_proc(int32_t, DIALOG*, int32_t)
10136 {
10137 return D_O_K;
10138 }
10139
10140 int32_t d_sslt_btn_proc(int32_t, DIALOG*, int32_t)
10141 {
10142 return D_O_K;
10143 }
10144
10145 int32_t d_sslt_btn2_proc(int32_t, DIALOG*, int32_t)
10146 {
10147 return D_O_K;
10148 }
10149
10150 int32_t d_sslt_btn3_proc(int32_t, DIALOG*, int32_t)
10151 {
10152 return D_O_K;
10153 }
10154
10155 int32_t d_sslt_btn4_proc(int32_t, DIALOG*, int32_t)
10156 {
10157 return D_O_K;
10158 }
10159
10160 int32_t d_ssrt_btn_proc(int32_t, DIALOG*, int32_t)
10161 {
10162 return D_O_K;
10163 }
10164
10165 int32_t d_ssrt_btn2_proc(int32_t, DIALOG*, int32_t)
10166 {
10167 return D_O_K;
10168 }
10169
10170 int32_t d_ssrt_btn3_proc(int32_t, DIALOG*, int32_t)
10171 {
10172 return D_O_K;
10173 }
10174
10175 int32_t d_ssrt_btn4_proc(int32_t, DIALOG*, int32_t)
10176 {
10177 return D_O_K;
10178 }
10179
10180 int32_t d_ssup_btn_proc(int32_t, DIALOG*, int32_t)
10181 {
10182 return D_O_K;
10183 }
10184
10185 int32_t d_ssup_btn2_proc(int32_t, DIALOG*, int32_t)
10186 {
10187 return D_O_K;
10188 }
10189
10190 int32_t d_ssup_btn3_proc(int32_t, DIALOG*, int32_t)
10191 {
10192 return D_O_K;
10193 }
10194
10195 int32_t d_ssup_btn4_proc(int32_t, DIALOG*, int32_t)
10196 {
10197 return D_O_K;
10198 }
10199
10200 int32_t d_tri_edit_proc(int32_t, DIALOG*, int32_t)
10201 {
10202 return D_O_K;
10203 }
10204
10205 int32_t d_triggerbutton_proc(int32_t, DIALOG*, int32_t)
10206 {
10207 return D_O_K;
10208 }
10209
10210 /*** end of zc_sys.cc ***/
10211
10212